放水果问题
桌上有一空盘,最多允许存放两只水果每次只能放入或是取出一只放一个苹果,爸爸只向盘中放一个苹果,妈妈只向盘中放一个桔子,两个儿子专等吃盘中的桔子,两个女儿专等吃苹果。用P、V操作实现爸爸、妈妈、儿子、女儿四个并发进程的同步与互斥的关系。
题目解析
由题目可知,这是一个经典的生产者——消费者问题的改编,爸爸相当于两个女儿,是生产者;妈妈相当于两个儿子,是生产者。
- 爸爸、妈妈、儿子、女儿四个角色之间的进程互斥,用mutex来表示;
- 对于爸爸和妈妈来说,每次放水果之前要确认盘子里面是否满了,用full表示盘子里面水果的数量;
- 对于儿子来说,每次取桔子之前都要确认盘子里面有没有桔子,用orange来表示盘子里面桔子的数量;
- 对于女儿来说,每次取苹果之前都要确认盘子里面有没有苹果,用apple来表示盘子里面苹果的数量;
代码
semaphore full=2,mutex=1,orange=0,apple=0;
void father()
{
while(TRUE)
{
P(full);
P(mutex);
放苹果;
V(mutex);
V(apple);
}
}
void mother()
{
while(TRUE)
{
P(full);
P(mutex);
放桔子;
V(mutex);
V(orange);
}
}
void son1(/son2) ()
{
while(TRUE)
{
P(orange);
P(mutex);
取桔子;
V(mutex);
V(full);
}
}
void daughter1(/daughter2) ()
{
while(TRUE)
{
P(apple);
P(mutex);
取苹果;
V(mutex);
V(full);
}
}
void main()
{
cobegin
father();mother();daughter1();
daughter2();son1();son2();
coend
}