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

编程入门 行业动态 更新时间:2024-10-14 00:28:21

桌子上有一个<a href=https://www.elefans.com/category/jswz/34/1702745.html style=盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等吃盘子中的橘子,女儿专等吃盘子中的苹果。只有盘子为空时,爸爸或妈妈才可向盘子中放一个水果,仅当盘子中"/>

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

问题描述

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

问题分析:

  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)操作。

更多推荐

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

本文发布于:2024-03-23 21:19:53,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1742945.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:盘子   专向   橘子   爸爸   水果

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!