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