问题描述
桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等吃盘子中的橘子,女儿专等吃盘子中的苹果。只有盘子为空时,爸爸或妈妈就可向盘子中放一个水果;仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出。问题分析
1) 关系分析。这里的关系稍复杂一些,首先由每次只能向其中放入一只水果可知爸爸和妈妈是互斥关系。爸爸和女儿、妈妈和儿子是同步关系,而且这两对进程必须连起来,儿子和女儿之间没有互斥和同步关系,因为他们是选择条件执行,不可能并发,如图2-8所示。2) 整理思路。这里有4个进程,实际上可以抽象为两个生产者和两个消费者被连接到大小为1的缓冲区上。

3) 信号量设置。首先设置信号量plate为互斥信号量,表示是否允许向盘子放入水果,初值为1,表示允许放入,且只允许放入一个。信号量 apple表示盘子中是否有苹果,初值为0,表示盘子为空,不许取,若apple=l可以取。信号量orange表示盘子中是否有橘子,初值为0,表示盘子为空,不许取,若orange=l可以取。解决该问题的代码如下:
semaphore plate=1; //空闲缓冲区
semaphore apple=0,orange = 0; //缓冲区初始化为空
void father()
{ //爸爸的进程
while(1)
{
wait(plate);
buffer[in] = apple;
signal(apple);
}
}
void mother()
{ //妈妈的进程
while(1)
{
wait(plate);
buffer[in] = orange;
signal(orange);
}
}
void daughter()
{ //女儿的进程
while(1)
{
wait(apple);
apple = buffer[out];
signal(plate);
}
}
void son()
{ //儿子的进程
while(1)
{
wait(orange);
orange = buffer[out];
signal(plate);
}
}
void main()
{
cobegin
father();
daughter();
mother();
son();
coend;
}