桌上有一个空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发

桌上有一个空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。

semaphore empty=1,mutex=1,apple=0,orange=0;  //为四个信号量赋初值

void father(){
     do{
           wait(empty);    //等待盘子为空
           wait(mutex);    //等待获取对盘子的操作
            爸爸向盘中放一个苹果或者桔子;

            signal(mutex);   //释放对盘子的操作

            if(apple){
               signal(apple);   //通知女儿可以来盘子中取苹果

            }else{

               signal(orange);// 通知儿子来取桔子

             }
          
    }while(TRUE);
}

void son(){                        
     do{
           wait(orange);       //判断盘子中是否有桔子
           wait(mutex);        //等待获取对盘子的操作
            儿子取出盘中的桔子;
           signal(mutex);      //释放对盘子的操作
           signal(empty);      //盘子空了,可以继续放水果了
    }while(TRUE);
}

void daugther(){               //与儿子进程雷同
     do{
           wait(apple);
           wait(mutex);
            女儿取出盘中的苹果;
           signal(mutex);
           signal(empty);
    }while(TRUE);
}

void main() {              
    cobegin
       father();son();daugther();
    coend
}

  • 29
    点赞
  • 176
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值