当前位置: 技术问答>linux和unix
文件里明明没有存入0这个数,为什么读文件时出现了?哪里出现了问题,紧急求助各位大神。。。。(linux操作系统 多线程同步)
来源: 互联网 发布时间:2017-05-18
本文导语: 本帖最后由 u011921487 于 2014-05-06 21:31:58 编辑 源代码如下: #include #include #include #define MAX 20 int Data[MAX][2];/*读取操作数时用*/ int size=0; sem_t sem;/*信号量*/ /* 从文件1.txt读取数据,每读一次,信号量加一,表示可...
#include
#include
#include
#define MAX 20
int Data[MAX][2];/*读取操作数时用*/
int size=0;
sem_t sem;/*信号量*/
/* 从文件1.txt读取数据,每读一次,信号量加一,表示可用资源增加*/
void ReadFile1(){
FILE *fp=fopen("1.txt","r");/*文件1.txt 是之sem_wait(&sem1);/*保证每次读数据都互斥*/
while(!feof(fp)){/*再文件没结束之前一直读数据*/
fscanf(fp,"%d %d",&Data[size][0],&Data[size][1]);/*每次读两个*/
sem_post(&sem);/*每读一次,同步信号量 加一,表示可用资源增加*/
size++;/*执行时由于各线程间的竞争导致size值会被任意修改,因此不会按照文件内的元顺序读出,加法与乘法运算每次也是随机的*/
}
fclose(fp);
}
/*从文件2.txt读取数据*/
void ReadFile2(){
FILE *fp=fopen("2.txt","r");
while(!feof(fp)){
fscanf(fp,"%d %d",&Data[size][0],&Data[size][1]);
sem_post(&sem);
size++;
}
fclose(fp);
}
/*阻塞等待缓冲区有数据,读取数据后,释放空间,继续等待*/
void Plus(){
while(1){
sem_wait(&sem);
printf("Plus:%d+%d=%dn",Data[size][0],Data[size][1],
Data[size][0]+Data[size][1]);
size--;
}
}
void Multiply(){
while(1){
sem_wait(&sem);/*直到资源被用完,否则(在线程切换之前)一直执行*/
printf("Multiply:%d*%d=%dn",Data[size][0],Data[size][1],
Data[size][0]*Data[size][1]);
size--;
}
}
void main(){
pthread_t t1,t2,t3,t4;
sem_init(&sem,0,0); /*第二个参数为零,表示信号量只能在当前进程的所有线程间共享;第三个参数为零,sem=0,多线程可同步,资源共享*/
pthread_create(&t1,NULL,(void *)ReadFile1,NULL);
pthread_create(&t2,NULL,(void *)ReadFile2,NULL);
pthread_create(&t3,NULL,(void *)Plus,NULL);
pthread_create(&t4,NULL,(void *)Multiply,NULL);
/*防止程序过早退出,让它在此无限期等待(如果没有则运行时没有结果显示。。。。。。)*/
pthread_join(t3,NULL);
}
运行结果:
文件 1.txt 里存的是 1 2 3 4 5 6 7
文件 2.txt -1 -2 -3 -4 -5 -6 -7
明明文件里没有 0 这数啊 ,为什么执行的时候出现这么多 0 的操作???????
望各位大神指点迷津 小弟感激不尽!
|
ReadFile1、 ReadFile2 写 Data 没有保护吧
|
ReadFile1/ReadFile2 两个线程可能同时操作 Data 数组