进程同步生产者-消费者问题C语言,经典进程同步问题 --- 生产者和消费者

问题描述:

一组生产者进程和一组消费者进程共享一个初始为空、大小为 n 的缓冲区,只

有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必须等待;只有缓冲区

不空时,消费者才能从中取出消息,否则必须等待。由于缓冲区是临界资源,它

只允许一个生产者放入消息,或者一个消费者从中取出消息。

分析:

关系分析:生产者和消费者对缓冲区互斥访问是互斥关系,同时生产者和

消费者又是一个相互协作的关系,只有生产者生产之后,消费者才能消费,

它们也是同步关系。

整理思路:这里比较简单,只有生产者和消费者两个进程,且这两个进程

存在着互斥关系和同步关系。那么需要解决的是互斥和同步的 PV 操作的

位置。3. 信号量设置:信号量 mutex 作为互斥信号量,用于控制互斥访问缓冲池,

初值为 1;信号量 full 用于记录当前缓冲池中“满”缓冲区数,初值为 0;

信号量 empty 用于记录当前缓冲池中“空”缓冲区数,初值为 n。

代码如下:

还是有点缺陷

如果编译失败,要额外加参数:-lpthread,例如:gcc -o p2 p2.c -lpthread

#include

#include

#include

#include

typedef int semaphore;

typedef int item;

#define Num 10

#define producerNum 10

#define consumerNum 10

item buffer[Num]={0};

int in=0, out=0;

int nextp&

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值