题目:桌上有一空盘,允许存放一只水果,爸爸可以向盘中放苹果,也可以向盘中放桔子,儿子专等着吃盘中的桔子,女儿专等着吃盘中的苹果,规定当盘空时一次只能放一只水果供吃者用,请用P、V原语实现爸爸、儿子和女儿三个并发进程的同步。
解:在本题中,应设置三个信号量S、So、Sa。
信号量S表示盘子是否为空,其初值为1;
信号量So表示盘中是否有桔子,其初值为0;
信号量Sa表示盘中是否有苹果,其初值为0。
同步描述如下:
semaphore S=1,Sa=0,So=0; father: while(true) { P(S); 将水果放入盘中; if(放入的是桔子)V(So); else V(Sa); };
son: while(true) { P(So); 从盘中取出桔子; V(S); 吃桔子; };
daughter: while(true) { P(Sa); 从盘中取出苹果; V(S); 吃苹果; };