在写Linux环境下的生产者/消费者问题的时候遇到了一些困难,大家能帮忙看看吗

evilRobotsWin 2020-05-26 02:04:11
一共有三个生产者和四个消费者,缓冲区大小为10,为了简单起见,生产者生产的都是5这个常数,但是不知道为什么运行不了,Linux下我也不知道该怎么调试,代码是这样的:

//生产者消费者问题

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<semaphore.h>

int in=0, out=0; //in和out为生产者和消费者在缓冲区内使用的数组下标
int buffer[10]={0,0,0,0,0,0,0,0,0,0}; //缓冲区大小为10
sem_t mutex,empty,full; //mutex为缓冲池的互斥信号量,empty表示空缓冲区的数量,full表示满缓冲区数量


int produce_an_item(){ //提供给生产者
int i=5;
return i;
}

//生产者
void *producter(void *arg){

while(1){
int i=produce_an_item(); //得到数据

sem_wait(&empty);
sem_wait(&mutex);
printf("生产者读到了数据%d\n",i);
buffer[in]=i; //将数据放入缓冲区
in = (in+1)%10; //下标向前移动
sem_post(&mutex);
sem_post(&full);
}

}

//消费者
void *consumer(void *arg){
while(1){
sem_wait(&full);
sem_wait(&mutex);
int i=buffer[out]; //i代表从缓冲区读出的数据
printf("消费者取出的数据为:%d\n",i);
buffer[out]=0; //读取后将此置为0
out=(out+1)%10;
sem_post(&mutex);
sem_post(&empty);
}

}
int main(){


//创建生产者线程
pthread_t p1,p2,p3;
pthread_create(&p1,NULL,producter,NULL);
pthread_create(&p2,NULL,producter,NULL);
pthread_create(&p3,NULL,producter,NULL);

//创建消费者进程
pthread_t c1,c2,c3,c4;
pthread_create(&c1,NULL,consumer,NULL);
pthread_create(&c2,NULL,consumer,NULL);
pthread_create(&c3,NULL,consumer,NULL);
pthread_create(&c4,NULL,consumer,NULL);

//初始化互斥信号量
sem_init(&mutex,0,1);
sem_init(&empty,0,10);
sem_init(&full,0,0);

//运行线程

pthread_join(p1,NULL);
pthread_join(p2,NULL);
pthread_join(p3,NULL);
pthread_join(c1,NULL);
pthread_join(c2,NULL);
pthread_join(c3,NULL);
pthread_join(c4,NULL);

return 0;

}

程序经常运行不起来,不知道是为什么,头都晕了。。请大家帮忙看看
...全文
157 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
coo135 2020-05-27
  • 打赏
  • 举报
回复
你程序写的是死循环,没有正常退出机制,在按ctrl+c 强行终止程序时,信号量不会被释放。 再次运行时,进程挂起等待这些信号量,因此就出现你的情况了。你重启下电脑程序又可以运行了。
  • 打赏
  • 举报
回复
linux 和 windows 关于信号量的操作不一样 linux创建后不销毁即使程序退出还是存在的,可以用ipcs -s查看 windows创建后,如果程序退出,那么这个信号量是自动销毁的
evilRobotsWin 2020-05-26
  • 打赏
  • 举报
回复
引用 4 楼 5250 的回复:
看看是不是有其他的进程也在gdb或者运行
没有欸。。应该是程序本身的问题吧
5250 2020-05-26
  • 打赏
  • 举报
回复
看看是不是有其他的进程也在gdb或者运行
evilRobotsWin 2020-05-26
  • 打赏
  • 举报
回复
引用 2 楼 5250 的回复:
运行不了是啥意思 编译出错还是运行了没反映或者其他? Linux下可以用gdb调试把
运行不了就是这样 按回车之后就一直卡在这里不运行(pc3是程序名),只有按CTRL+c才能结束掉,不知道具体是哪里除了问题。偶尔也会像上面那样可以执行,但大部分时间是这样卡住的。 我也试了用gdb调试,但是看不懂线程到底运行到哪里了
5250 2020-05-26
  • 打赏
  • 举报
回复
运行不了是啥意思 编译出错还是运行了没反映或者其他?
Linux下可以用gdb调试把
evilRobotsWin 2020-05-26
  • 打赏
  • 举报
回复
55555有人吗

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧