`

线程依次输出数字

 
阅读更多

问题:

有四个线程1,2,3,4,线程1的功能就是输出1,线程2的功能就是输出2,以此类推....

现在有四个文件.ABCD.初始都为空(pthread + C/C++ 谷歌笔试题)。

现要让四个文件呈如下格式:

A:  1 2 3 4 1 2....

B:  2 3 4 1 2 3....

C:  3 4 1 2 3 4....

 

D:  4 1 2 3 4 1....

 

解法:

 

 

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<unistd.h>
//线程的数量
const int THREAD_NUM = 4;
FILE* fp[THREAD_NUM];
pthread_t threads[THREAD_NUM];
//每个线程写字符的次数
const int ch_num = 10;
int thread_ids[THREAD_NUM];
//记录文件里的字符的个数对线程数取模
int file_ch_num[THREAD_NUM];
//完成某一轮的线程的数目
int finish_turn[ch_num];
/*
 * @brief 判断数组里所有的都元素的值是否都相等
 */
bool is_all_same(int* ar, int n){
        for(int i = 1; i < n; i++){
                if(ar[i] != ar[0]) return false;
        }
        return true;
}

bool ouput_ar(int* ar, int n){
        printf("\n");
        for(int i = 0; i < n; i++){
                printf("[%d, %d]", i, ar[i]);
        }
        printf("\n");
        return true;
}
/*
 * @brief 写文件
 * @param int thread_id 线程的序数,从0开始
 */
void* write_to_file(void* thread_id_ptr){
        int thread_id = *((int*)thread_id_ptr);
        int file_pos = thread_id;
        //当前线程输出的数字
        int number = thread_id + 1; 
        for(int i = 0; i < ch_num; i++){
                while(true){
                        //如果上一轮还有线程未完成则停留下
                        if(i > 0 && finish_turn[i -1 ] < THREAD_NUM){
                                usleep(100);
                                continue ;
                        }
                        if((file_pos + file_ch_num[file_pos]) % THREAD_NUM == thread_id) break;
                        usleep(100);
                }
                fprintf(fp[file_pos], "%d ", number);
                file_ch_num[file_pos]++;
                if(file_ch_num[file_pos] >= THREAD_NUM) file_ch_num[file_pos] = 0;
                file_pos--;
                if(file_pos < 0) file_pos = THREAD_NUM - 1;
                finish_turn[i]++;
        }
        return NULL;
}
int main(int argc, char* argv[]){
        for(int i = 0; i < THREAD_NUM; i++){
                char fname[32];
                sprintf(fname, "/tmp/pthread/%c", 'A'+i);
                fp[i] = fopen(fname, "w+");
                file_ch_num[i] = 0;
        }
        for(int i = 0; i < THREAD_NUM; i++){
                thread_ids[i] = i;
        }
        for(int i = 0; i < ch_num; i++){
                finish_turn[i] = 0;
        }
        for(int i = 0; i < THREAD_NUM; i++){
                pthread_create(threads+i, NULL, write_to_file, thread_ids+i);
        }
        for(int i = 0; i < THREAD_NUM; i++){
                pthread_join(threads[i], NULL);
        }
        for(int i = 0; i < THREAD_NUM; i++){
                if(fp[i]) fclose(fp[i]);
        }
        return 0;
}

 

 

分享到:
评论

相关推荐

    java10个线程按照顺序打印1-100

    本主题聚焦于如何使用Java实现10个线程按照顺序打印数字1到100。这种问题通常通过线程间通信和同步机制来解决,如`synchronized`关键字、`wait()`、`notify()`或`notifyAll()`方法,以及`Semaphore`、`CyclicBarrier...

    依次去掉n中的某一位数字,得到m个整数,并将这m个整数按从小到大的次序排列后输出.docx

    在这个编程问题中,我们需要实现一个程序来处理一个正整数,按照特定的规则生成一系列新的整数,并将它们按升序排列输出。这个问题涉及到的主要知识点包括C++编程、一维数组的操作、冒泡排序算法以及输入输出的处理...

    java 多线程实例

    在主程序中,同样创建了10个线程,但这些线程共享同一个`R`对象,因此它们共享同一个`x`变量,从而按顺序输出了从1到10的数字。 ```java R r = new R(); for (int i = 0; i ; i++) { Thread t = new Thread(r); t...

    Programming_In_Lua 和 最新 xvm api v101

    8. **协程**:Lua提供了轻量级的并发模型——协程(coroutine),它们不是线程,而是允许在一个线程内实现多个并发执行流。 9. **XVM API**:XVM(eXtended Visualization Mod)是World of Tanks的一个扩展插件,它...

    c语言实现数字雨.zip

    在C语言中实现数字雨,通常是指在控制台模拟一种动态效果,即数字依次从屏幕顶部向下滚动,形成类似雨水落下的视觉体验。这是一种常见的编程练习,有助于学习者熟悉字符输出、循环结构、定时器以及多线程等基础知识...

    java基本教程之线程休眠 java多线程教程

    这导致线程在执行过程中出现短暂的暂停,使得输出的数字之间有间隔,而不是连续快速地打印。 ```java class ThreadA extends Thread { public ThreadA(String name) { super(name); } public synchronized ...

    深入多线程之:解析线程的交会(Thread Rendezvous)详解

    在上述代码示例中,创建了一个`Barrier`实例,设置参与者数量为3,然后启动3个线程,每个线程都调用`SignalAndWait()`,依次打印数字0到4。由于`Barrier`的作用,所有线程都会在打印完一组数字后同时进入下一组,...

    PHP+shell实现多线程的方法

    这个PHP脚本会依次输出数字0到9,并且每个数字之间间隔10秒,这样做的目的是为了模拟一个耗时较长的任务。 然后,我们编写一个shell脚本来并行执行这个PHP脚本: ```bash #!/bin/bash for i in {1..10} do /usr/...

    Java输出n以内的所有素数

    该算法的基本思想是:从2开始,依次将每个素数的倍数标记为合数,最后剩下的未被标记的数就是素数。 二、Java实现素数筛 1. 初始化数组 首先,我们需要创建一个boolean类型的数组,长度为n+1,所有元素初始化为true...

    基于单片机的LED数字大屏幕显示系统

    数据依次输入74HC595,当所有数据加载完成后,通过RCK的上升沿将数据并行输出,点亮对应的LED。 5. **系统设计方案**: - 硬件框架包括上位机、下位机、LED点阵及74HC595驱动芯片。 - PA和PB口作为数据输出,连接...

    腾讯2014校园招聘软件开发类笔试试题

    18. **线程共享资源**:在同一进程中,线程可以共享数据段和文件描述符,但每个线程有自己的栈和寄存器集。 19. **构造函数的执行顺序**:在派生类中,构造函数的执行顺序是基类构造函数先执行,然后是派生类的构造...

    Java设计社区文艺汇演活动相关小游戏代码.docx

    这个游戏中,实际的实现可能需要更复杂的逻辑,例如网络通信来同步玩家的状态和操作,这超出了单个Java程序的范畴,可能需要使用多线程、网络编程等高级概念。 通过这两个小游戏,我们可以学习到Java的基本语法、...

    Arduino项目开发 Digital_toneMultiple_toneMultiple.pdf

    2. 数字引脚的输入/输出控制:`noTone()`和`tone()`函数。 3. 延时控制:`delay()`函数。 4. 音频信号生成:通过定时器在数字引脚上生成方波模拟音调。 5. 多线程概念:在循环中顺序播放不同引脚的音调。 这些知识...

    陕西师范大学-《java程序设计》(专升本)考评作业-含答案.pdf

    * 顺序结构:程序从上到下依次执行 * 选择结构:if 语句、switch 语句 * 循环结构:for 语句、while 语句、do-while 语句 四、Java 函数 * Java 中的函数可以重载和重写 * 函数的声明格式为:返回类型 函数名...

    基于MATLAB寻找素数的源程序

    而埃拉托斯特尼筛法则是一种更有效的筛选方法,通过依次剔除已知素数的倍数,可以找出一定范围内的所有素数。 在MATLAB源程序中,可能包含以下几个关键部分: 1. **输入处理**:程序会接收用户输入的数字范围,...

    2021-2022计算机二级等级考试试题及答案No.12755.docx

    6. 未提供具体程序,但根据题目描述,输出应为 1 2 3,表示程序在循环或序列中依次打印了这三个数字。 7. Response.Write("新浪") 会输出 "新浪",其中引号内的内容会被当作字符串输出,不会自动转换为超链接。答案...

    2021-2022计算机二级等级考试试题及答案No.10670.docx

    1. 计算机程序的运行结果:题目中的程序可能是一个简单的数字序列输出,正确答案是C,表示程序会依次输出1、2、3、4。 2. Word的格式工具栏:B字母按钮用于加粗文本,而不是变为斜体,所以描述是错误的。 3. ...

Global site tag (gtag.js) - Google Analytics