解决同步与互斥问题的一些案例:一个吃水果问题。
问题描述:桌上有一只盘子,每次只能放一个水果,爸爸专向盘中放苹果,妈妈专向盘中放桔子,儿子专等吃盘里的桔子,女儿专等吃盘里的苹果。只要盘子空,则爸爸或妈妈可向盘中放水果,仅当盘中有自己需要的水果时,儿子或女儿可从中取出,那么四人之间的同步关系是什么?如何实现四人正确活动的程序?
解:四人之间的关系:
1爸爸,妈妈都要使用盘子,所以两者是互斥关系; 2爸爸放的苹果,女儿吃,所以两者是同步关系; 3妈妈放的桔子,儿子吃,所以两者也是同步关系。
struct semaphore s,sp,so=1,0,0;
cobegin
void father (void)
{
while(TRUE){
have an apple; P(s);
put an apple;
V(sp);} }
void mother (void)
{
while(TRUE){
have an orange;
P(s);
put an orange;
V(so);} }
void son (void)
{
while(TRUE){
P(sp);
get an orange;
V(s);
eat an orange;} }
void daught (void)
{
while(TRUE){
P(sp);
get an apple;
V(s);
eat an apple;} }
coend