`

线程依次输出数字

 
阅读更多

问题:

有四个线程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

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

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

    【题目】将一个m位(m&gt;1)的正整数n,依次去掉n中的某一位数字,得到m个整数,并... 依次输出数组a中的m个元素; (4)在主函数中输入一个整数,并对输入范围进行合法化的判断,对输入的数据进行处理,输出处理结果。

    多线程技术在数据实时采集分析中的应用.doc

    数字接口测试系统根据数字接口设备的工作原理,输出422串行数据和自定义串行总线的控制信号(YCK,YZM)给数字接口设备,并对其输出的串行数据(YDATA)进行采集、存储、分析和处理,从而达到对被测设备进行检测的...

    用卷积滤波器matlab代码-parallel-prog:CUDA项目

    要找到目标存储桶,将浮点数乘以10得到第一个数字,该数字确定存储桶号 C)直方图该程序有效地实现了直方图功能。 在此实现中,每个块都维护一个表,每个线程都在其中保留一个表 分别为每个BIN_COUNT个计数。 然后...

    计算机应用模型机研制技术

    这一数字通用系统平台使微机应用不再局限在标准的输入和输出设备上,而是更深入地应用在非标准设备层次上,非常适于教学和实时控制的开发。 本书分两个部分,共七章,依次介绍了16位计算机应用模型机和32位计算机...

    达内 coreJava 习题答案

    6、输出所有的水仙花数,把谓水仙花数是指一个数3位数,其各各位数字立方和等于其本身, 例如: 153 = 1*1*1 + 3*3*3 + 5*5*5 class DafodilNumber{ public static void main(String[] args){ System.out....

    cmd操作命令和linux命令大全收集

    fc one.txt two.txt &gt; 3st.txt 对比二个文件并把不同之处输出到3st.txt文件中,"&gt; "和"&gt; &gt;" 是重定向命令 at id号 开启已注册的某个计划任务 at /delete 停止所有计划任务,用参数/yes则不需要确认就直接停止 at ...

    语音识别的MATLAB实现

    在此线程中做如下两个工作:将数据送入buffer,并将数据传入某个参数(其调用一个函数,将buffer中的数据送入该函数的参数*pt),而这些数据正是我们要利用和处理的数字化的语音信息。 2 声音的预处理: 声音信息的...

    (重要)AIX command 使用总结.txt

    重启小型机选择主控台,按屏幕上提示的数字;选择语言,一般选english;选择3进入维护模式(start maintenence mode for system recovery); 选择1进入access a root volume group;选择0进入下一个菜单; --选择1--选择...

    正则表达式

    尾部的数字,那么如果我们将模式的数字部分放在括号中 (/ [a-z] + (\d+)/) ,我们就可以从所检索到的任何匹配中抽取数字了,之后我们会对此进行解析的. 代括号的子表达式的另一个用途是,允许我们在同一正则表达式的...

    windows驱动开发技术详解-part2

     6.1.7 字符串与整型数字相互转换  6.1.8 ANSI_STRING字符串与UNICODE_STRING字符串相互转换  6.2 内核模式下的文件操作  6.2.1 文件的创建  6.2.2 文件的打开  6.2.3 获取或修改文件属性  6.2.4 文件...

    Windows驱动开发技术详解的光盘-part1

     6.1.7 字符串与整型数字相互转换  6.1.8 ANSI_STRING字符串与UNICODE_STRING字符串相互转换  6.2 内核模式下的文件操作  6.2.1 文件的创建  6.2.2 文件的打开  6.2.3 获取或修改文件属性  6.2.4 文件...

    oracle数据库经典题目

    5.Where子句可以接收From子句输出的数据,而HAVING子句则可以接收来自WHERE、FROM或GROUP BY子句的输入。 6.在SQL语句中,用于向表中插入数据的语句是Insert。 7.如果需要向表中插入一批已经存在的数据,可以在...

    PT80-NEAT开发指南v1.1

    NEAT 开 发 指南 文档 适用于 PT80 系列 移动数据终端 版本记录 版本号 版本描述 发布日期 V 1.0 初始版本。 2012-04-12 V1.1 修改前三章内容 2012-09-25 目录 第一章 关于本手册.....................................

    c++ 面试题 总结

    2.输入一个字符串,将其逆序后输出。(使用C++,不建议用伪码) #include using namespace std; void main() { char a[50];memset(a,0,sizeof(a)); int i=0,j; char t; cin.getline(a,50,'\n'); for(i=0,j=...

Global site tag (gtag.js) - Google Analytics