问答题
桌上有一空盘,允许存放一个水果。爸爸可向盘中放苹果,也可向盘中放橘子,儿子专等吃盘中的橘子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一个水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿3个并发进程的同步。
【正确答案】在本题中,爸爸、儿子、女儿共用一个盘子,盘中一次只能放一个水果。当盘子为空时,爸爸可将一个水果放入果盘中。若放入果盘中的是橘子,则允许儿子吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。本题实际上是生产者-消费者问题的一种变形。这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。
在本题中,应设置3个信号量S、So、Sa。
Semaphore S=1; //信号量S表示盘子是否为空,其初值为1
Semaphore Sa=0; //信号量Sa表示盘中是否有苹果,其初值为0
Semaphore So=0; //信号量So表示盘中是否有橘子,其初值为0
Procedure father{ //父进程
While(true){
P(S);
将水果放入盘中;
if (放入的是橘子)
V(So);
else
V(Sa);
}
}
Procedure son{ //儿子进程
While(true){
P(So);
从盘中取出橘子;
V(S);
吃橘子;
}
}
Procedure daughter{ //女儿进程
While(true){
P(Sa);
从盘中取出苹果;
V(S);
吃苹果;
}
}
【答案解析】