线程依次输出数字
#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;}
?
?