#include
#include
#include
#define NUM 200
int stack[NUM][2]; //公共缓冲区
int size=0; //初始化数组索引
sem_t sem1,sem2,sem3,sem4; //定义四个信号量
void read1(void){ //线程运行函数,负责从文件读取数据
FILE fp=fopen("data0.txt","r"); //以只读方式打开文件data1
while(!feof(fp)){
sem_wait(&sem1); //减少信号量sem1
if(!fscanf(fp,"%d %d",&stack[size][0],&stack[size][1]))return;
size++; //读两个数到公共缓冲区
sem_post(&sem2); //增加信号量sem2
}
fclose(fp); //关闭文件
}
void read2(void){ //线程运行函数,负责从文件读取数据
FILE *fp=fopen("data1.txt","r"); //以只读方式打开文件data2
while(!feof(fp)){
sem_wait(&sem2); //减少信号量sem2
if(!fscanf(fp,"%d %d",&stack[size][0],&stack[size][1]))return;
size++; //读两个数到公共缓冲区
sem_post(&sem3); //增加信号量sem3
}
fclose(fp);
}
void plus1(void){ //线程运行函数,负责加运算
while(1){
sem_wait(&sem3); //减少信号量sem3
if(size==0){return;}
size--;
printf("Plus:%d+%d=%d\n",stack[size][0],stack[size][1],stack[size][0]+stack[size][1]); //从公共缓冲区取数并进行加运算
sem_post(&sem4); //增加信号量sem3
}
}
void multi2(void){ //线程运行函数,负责乘运算
while(1){
sem_wait(&sem4); //减少信号量sem4
if(size==0){return;}
size--;
printf("Multiply:%d%d=%d\n",stack[size][0],stack[size][1],stack[size][0]*stack[size][1]); //从公共缓冲区取数并进行乘运算
sem_post(&sem1); //增加信号量sem3
}
}
int main(void){
pthread_t t1,t2,t3,t4; //定义线程标识符
sem_init(&sem1,0,1); //初始化信号量
sem_init(&sem2,0,0);
sem_init(&sem3,0,0);
sem_init(&sem4,0,0);
pthread_create(&t1,NULL,(void *)read1,NULL); //创建线程,绑定线程运行函数
pthread_create(&t2,NULL,(void *)read2,NULL);
pthread_create(&t3,NULL,(void *)plus1,NULL);
pthread_create(&t4,NULL,(void *)multi2,NULL);
pthread_join(t1,NULL); //等待线程运行结束
}
Segmentation fault (core dumped)关于线程问题
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
悬赏问题
- ¥15 vue3页面el-table页面数据过多
- ¥100 vue3中融入gRPC-web
- ¥15 kali环境运行volatility分析android内存文件,缺profile
- ¥15 写uniapp时遇到的问题
- ¥15 vs 2008 安装遇到问题
- ¥15 matlab有限元法求解梁带有若干弹簧质量系统的固有频率
- ¥15 找一个网络防御专家,外包的
- ¥100 能不能让两张不同的图片md5值一样,(有尝)
- ¥15 informer代码训练自己的数据集,改参数怎么改
- ¥15 请看一下,学校实验要求,我需要具体代码