与文件操作结合的Linux多线程编程实例
利用多线程编程实现数据协同计算
题目要求:两个数据文件1.dat和2.dat,它们的内容分别为1 2 3 4 5 6 7 8 9 10和 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 , 设计一个程序,在这个程序中一共有3个线程,其中两个线程负责从文件读取数据到公共的缓冲区,另外一个线程从缓冲区读取数据作不同的处理(加或乘运算)。
题目分析:本题使用信号量对线程进行加锁操作,对于三个线程所要求的同步互斥即读取完缓冲区buffer1和buffer2后再进行求和与求乘积,可以使用四个信号量sem1,sem2,sem3,sem4完成。
可得到
代码实现如下:
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
sem_t sem1,sem2,sem3,sem4;
int buffer1,buffer2;
void *read1(){
FILE *file1;
file1 = fopen("1.dat","r");
while(!feof(file1)){
sem_wait(&sem3);
fscanf(file1,"%d",&buffer1);
sem_post(&sem1);
}
fclose(file1);
}
void *read2(){
FILE *file2;
file2 = fopen("2.dat","r");
while(!feof(file2)){
sem_wait(&sem4);
fscanf(file2,"%d",&buffer2);
sem_post(&sem2);
}
fclose(file2);
}
void *plusNum(){
while(1){
sem_wait(&sem1);
sem_wait(&sem2);
int sum;
int pro;
sum=buffer1+buffer2;
pro=buffer1*buffer2;
printf("the sum: %d+%d=%d\n",buffer1,buffer2,sum);
printf("the pro: %d*%d=%d\n\n",buffer1,buffer2,pro);
sem_post(&sem3);
sem_post(&sem4);
}
}
int main(){
sem_init(&sem1, 0, 0);
sem_init(&sem2, 0, 0);
sem_init(&sem3, 0, 1);
sem_init(&sem4, 0, 1);
pthread_t tid[3];
pthread_create(&tid[0], NULL, (void *)read1, NULL);
pthread_create(&tid[1], NULL, (void *)read2, NULL);
pthread_create(&tid[2], NULL, (void *)plusNum, NULL);
pthread_join(tid[0], NULL);
pthread_join(tid[1], NULL);
pthread_join(tid[2], NULL);
return 0;
}