桌子上有一个盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等吃盘子中的橘子,女儿专等吃盘子中的苹果。只有盘子为空时,爸爸或妈妈才可向盘子中放一个水果,仅当盘子中

问题描述

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

问题分析:

  1. 关系分析。 这里的关系要稍复杂一些。 由每次只能向其中放入一只水果可知, 爸爸和妈妈是
    互斥关系。爸爸和女儿、妈妈和儿子是同步关系,而且这两对进程必须连起来,儿子和女儿
    之间没有互斥和同步关系,因为他们是选择条件执行,不可能并发

  2. 整理思路。 这里有4个进程,实际上可抽象为两个生产者和两个消费者被连接到大小为1
    的缓冲区上。

  3. 信号量设置。 首先将信号量plate设置互斥信号量,表示是否允许向盘子放入水果,初值
    为1表示允许放入,且只允许放入一个。信号量apple表示盘子中是否有苹果,初值为0
    表示盘子为空,不许取,apple= 1表示可以取。信号量orange表示盘子中是否有橘子,
    初值为0表示盘子为空,不许取,orange = 1表示可以取。

解决该问题的代码如下:

semaphore plate=1,apple=0, orange=0;
dad() {//父亲进程
	while(1) {
		prepare an apple;
		P (plate) ;//互斥向盘中取、放水果
		put the apple on the plate;//向盘中放苹果
		V(apple) ;//允许取苹果
	}
}


mom() {//母亲进程
	while(1) {
		prepare an orange;
		P (plate);//互斥向盘中取、放水果
		put the orange on the plate;//向盘中放橘子
		V (orange) ;//允许取橘子
	}
}


son() {//儿子进程
	while(1) {
		P (orange);//互斥向盘中取橘子
		take an orange from the plate;
		V (plate) ;//允许向盘中取、放水果
		eat the orange;
	}
}

daughter() {//女儿进程
	while(1) {
		P (apple) ;//互斥向盘中取苹果
		take an apple from the plate;
		V(plate) ;//运行向盘中取、放水果
		eat the apple;
	}
}
  • dad0和 daughter()、mom)和son()必须连续执行,正因为如此,也只能在女儿拿走苹果后或儿子拿走橘子后才能释放盘子,即V(plate)操作。
  • 40
    点赞
  • 193
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值