同步互斥——理发师睡觉问题

问题描述

理发店有一位理发师,一把理发椅和N把供等候的顾客坐的椅子。
如果没有顾客,理发师在理发椅上睡觉;
当有一个顾客到来时,他必须先唤醒理发师;
如果顾客来时理发师正在理发,如果有空椅子,坐下等待,否则离开。
用P,V操作解决上述问题中的同步和互斥关系。

分析

将顾客看作N个生产者,理发师是1个消费者。
理发师和椅子是临界资源,故顾客间是互斥关系;
理发师和顾客是同步关系。

信号量设置

Semaphore barberReady = 0  互斥量,只能取0或1  
Semaphore accessSeat = 1  互斥量,如果为1,表明椅子数可以增加或减少,相当于给椅子加锁,避免两个顾客同时坐一把椅子
Semaphore num_wait = 0   坐在椅子上等待的顾客数
int seat_free    空着的椅子数目

参考(https://en.wikipedia.org/wiki/Sleeping_barber_problem)

解答

/*顾客进程*/
void customer()
{   
    while(true)
    {
        P(accessSeat);  //试图坐下
        if(seat_free > 0)
        {
            seat_free--;  //坐下
            V(num_wait);  //试图唤醒理发师,
            V(accessSeat);  //不用再锁着椅子
            P(baberReady); //等待理发师ready
            理发;
        }
        else
        {
            V(accessSeat);  //释放加在椅子上的锁
            离开;
        }
    }
}

/*理发师进程*/
void barber()
{
    while(true)
    {
        P(num_wait);   //尝试获得一位顾客,如果没有,去睡觉
        P(accessSeat);   //尝试获得椅子锁,更改空闲椅子数目
        seat_free++;    //空椅子加1
        V(baberReady);    //理发师准备好了
        V(accessSeat);    //无需继续锁着椅子
        理发;
    }
}

转载于:https://www.cnblogs.com/EIMadrigal/p/9248212.html

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值