进程同步之理发师问题的理解

描述:理发店有一位理发师和一把理发椅。如果没有顾客,则理发师在理发椅上睡觉;当有顾客到达时,如理发师在睡觉则唤醒他理发,如果理发师正忙着理发,则坐在椅上等待。   

编写程序实现理发师和顾客行为的正确描述。 

 

行为分析:

  Ø理发师行为:睡觉、理发。没有顾客睡觉,有顾客理发。

  Ø顾客行为:理发或等待。

  Ø相互作用:

    理发师与顾客之间:同步

    顾客与顾客之间:无

信号量设置:

  semaphore customers=0; //customers表示等候理发的顾客数量

  semaphore barbers=0;  //barbars表示等候顾客的理发师数量

semaphore customers=0; //customers表示等候理发师的顾客
semaphore barbers=0;  //barbars表示已经醒来的理发师
int waiting =0;     //等待人数
semaphore mutex=1;  //用于保护waiting的互斥访问

理发师进程:
while(1)
{
    p(customers) //检查是否有顾客
        P(mutex);
            waiting=waiting-1;
        v(mutex);
    v(barbers)  //理发师已醒来
    Cut_hair();

}

顾客进程:
P(mutex) //占空椅子的操作是互斥的,即一个一个占
if(waiting<n) then  //如果座位未满
{
    waiting=waiting+1;
    V(mutex);
    V(customers);
    P(barbers); //检查是否有醒来的理发师
    Get_haircut();
}
else
{
    V(mutex); //表示座位已经满了
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值