【王道考研】多生产者-多消费者

2.3.7 多生产者-多消费者

知识来源: B站王道考研

问题描述

桌子上有一个盘子,每次只能向其中放入一个水果。爸爸专向盘子放入苹果,妈妈专门放入橘子,儿子专等着吃盘子中的橘子,女儿专等着吃盘子中的苹果。只有盘子为空时,爸爸或妈妈才可向盘子中放入一个水果。仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。
在这里插入图片描述

// 实现互斥访问盘子(缓冲区)
semaphore mutex = 1;
// 盘子中有几个苹果
semaphore apple = 0;
// 盘子中有几个橘子
semaphore orange = 0;
// 盘子中还可以放入多少个水果
semaphore plate = 1;
dad(){
	while(1){
		准备一个苹果;
		P(plate);
		P(mutex);
		把苹果放入盘子;
		V(mutex);
		V(apple);
	}
}
mom(){
	while(1){
		准备一个橘子;
		P(plate);
		P(mutex);
		把橘子放入盘子;
		V(mutex);
		V(orange);
	}
}
daughter(){
	while(1){
		P(apple);
		P(mutex);
		从盘子中取出苹果;
		V(mutex);
		V(plate);
		吃掉苹果;
	}
}
son(){
	while(1){
		P(orange);
		P(mutex);
		从盘子中取出橘子;
		V(mutex);
		V(plate);
		吃掉橘子;
	}
}

本题中的缓冲区大小为1,在任何时刻,apple、orange、plate三个同步信号量中最多只有一个是1。因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利地进入临界区。

如果容量为2,则不满足。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值