19生产者--消费者问题

1、生产者消费者问题:一组生产者进程和一组消费者进程共享一个初始为空、大小为n的缓冲区,只有缓冲区没满时,生产者才把消息放到缓冲区,否则必须等待;只有缓冲区不空时,消费者才能从中取出消息,否则必须等待。由于缓冲区是临界资源,它只允许一个生产者放入消息,或者一个消费者从中取出消息。
2、问题分析
2.1、关系分析:生产者和消费者对缓冲区互斥访问是互斥关系,同时生产者和消费者又是一个相互协作的关系,只有生产者生产之后,消费者才能消费,它们是同步关系。
2.2、整理思路:只有生产者和消费者两个进程,正好是这两个进程存在着互斥和同步关系。那么需要解决的是互斥和同步PV操作的位置。
2.3、信号量设置。信号量mutex作为互斥信号量,它用于控制互斥访问缓冲池,互斥信号量初始值为1;信号量full用于记录当前缓冲池中“满”缓冲区数,初值为0。信号量empty用于记录当前缓冲池中“空”缓冲区,初值为n。
3、生产者—消费者进程描述代码如下:
Semaphore mutex=1;//临界区互斥信号量
Semaphore empty=n;//空闲缓冲区
Semaphore full=0;//缓冲区初始化为空
Producer(){ //生产者进程
While(1){
Produce an item in nextp;//生产数据
P(empty); //获取缓冲区单元
P(mutex); //进入临界区
Add nextp to buffer; //将数据放入缓冲区
V(mutex); //离开临界区,释放互斥信号量
V(full); //满缓冲区数加1
}
Consumer(){ //消费者进程
While(1){
P(full); //获取满缓冲区单元
P(mutex); //进入临界区
Remove an item from buffer; //从缓冲区中取出数据
V(mutex); //离开临界区,释放互斥信号量
V(empty); //空缓冲区数加1
Consume the item; //消费数据
}
}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光怪陆离的节日

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值