【操作系统】多生产者-多消费者问题

桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放橘子,儿子专等着吃盘子中的句子,女儿专等着吃盘子中的苹果。只有盘子空时,爸爸或妈妈才可向盘子中放一个水果。仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。用PV操作实现上述过程。
在这里插入图片描述
由于盘子里的容量是有限的,盘子只能放一个水果,所以那么如果父亲在盘子里放了一个苹果,而女儿还没有来得及取出苹果的时候,此时母亲尝试把橘子放到盘子里去,因为盘子里只能放一个水果,此时母亲放橘子的行为会被阻塞;此时儿子如果想要拿盘子里的水果,而苹果不是儿子想要的,那么此时儿子的行为也该被阻塞。
在这里插入图片描述
类似于生产者消费者进程,可以把盘子看作一个大小为1的缓冲区,把父亲母亲分别看作两个生产者,把儿子女儿分别看成两个消费者。

在这里插入图片描述
对于缓冲区的访问一般需要互斥的访问。
互斥:在临界区前后分别PV
互斥关系:(mutex=1)
同步:前V后P
同步关系(一前一后):

  1. 父亲将苹果放入盘子后,女儿才能取苹果
  2. 母亲将橘子放入盘子后,儿子才能取橘子
  3. 只有盘子为空时,父亲或母亲才能放入水果。(盘子为空这个事件既可以由儿子触发也可以由女儿触发)
    在这里插入图片描述
    因为父亲进程需要把苹果放进盘子,女儿才可以拿到,因此设置一个同步信号量apple,用来实现同步关系,由于刚开始盘子里是没有苹果的,所以我们设置apple=0,只有父亲执行V操作后,女儿执行的P操作才不会被阻塞。同理为母亲进程设置orange=0;另外只有盘子为空的时候,父亲和母亲才可以放入水果,而刚开始盘子本来就是空的,所以父亲和母亲在刚开始就可以向盘子里放入一个水果,这一对同步关系需要设置一个信号量plate=1来表示此时盘子是否为空。
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值