线程依次输出数字

问题:

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值