桌上有个能呈得下五个水果的空盘子。爸爸不停地向盘中放苹果或桔子,儿子不停地从盘中去除桔子享用,女儿不停地从盘中取出苹果享用。规定三人不能同时从盘中去取放水果。

试用信号量实现爸爸、儿子和女儿这三个循环进程之间的同步。

解析:

本题是生产者消费者问题的变形,相当于一个能生产两种产品的生产者和两个消费者提供产品的同步问题,因此,需要设置两个不同的full信号量apple和orange,初值均为0

解:

信号量定义:

semaphore empty=5,orange=0,apple=0,mutex=1
  • 1.

爸爸:

Dad(){
  while(1){
    wait(empty);
    wait(mutex);
    将水果放入盘中;
    signal(mutex);
    if(放入的是橘子)signal(orange);
    else signal(apple);
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

儿子:

Son(){
  while(1){
    wait(orange);
    wait(mutex);
    从盘中取一个橘子;
    signal(mutex);
    signal(empty);
    享用橘子;
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

女儿:

Daughter(){
 while(1){
   wait(apple);
   wait(mutex);
   从盘中取出一个苹果;
   signal(mutex);
   signal(empty);
   享用苹果;
 }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

main

void main(){
  cobegin
   dad();son();daughter();
  coend
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

总结:

【操作系统】进程同步:苹果橘子问题_生产者消费者