(多线程同步练习)桌子上有一只盘子,每次只能放一只水果,爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,一个儿子专等吃盘子里的橘子,一个女儿专等吃盘子里的苹果。写出能使爸爸、妈妈、儿子、女儿正确同步工作的Simone Zeng的博客-CSDN博客桌子上有一只盘子
桌子上有一个盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等吃盘子中的橘子,女儿专等吃盘子中的苹果。只有盘子为空时,爸爸或妈妈才可向盘子中放一个水果,仅当盘子中_许你常欢的博客-CSDN博客

问题描述

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

问题分析:

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

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

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

  1. semaphore plate=1apple=0 orange=0;
  2. dad() {//父亲进程
  3. while(1) {
  4. prepare an apple;
  5. P (plate) ;//互斥向盘中取、放水果
  6. put the apple on the plate;//向盘中放苹果
  7. V(apple) ;//允许取苹果
  8. }
  9. }
  10. mom() {//母亲进程
  11. while(1) {
  12. prepare an orange;
  13. P (plate);//互斥向盘中取、放水果
  14. put the orange on the plate;//向盘中放橘子
  15. V (orange) ;//允许取橘子
  16. }
  17. }
  18. son() {//儿子进程
  19. while(1) {
  20. P (orange);//互斥向盘中取橘子
  21. take an orange from the plate;
  22. V (plate) ;//允许向盘中取、放水果
  23. eat the orange;
  24. }
  25. }
  26. daughter() {//女儿进程
  27. while(1) {
  28. P (apple) ;//互斥向盘中取苹果
  29. take an apple from the plate;
  30. V(plate) ;//运行向盘中取、放水果
  31. eat the apple;
  32. }
  33. }
  • dad0和 daughter()、mom)和son()必须连续执行,正因为如此,也只能在女儿拿走苹果后或儿子拿走橘子后才能释放盘子,即V(plate)操作。