线程间同步经典问题——哲学家就餐、消费者生产者、睡眠的理发师、读者写者

线程间同步经典问题——哲学家就餐、消费者生产者、睡眠的理发师、读者写者

哲学家就餐

场景描述

五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌中间有一大碗意大利面,每两个哲学家之间有一只餐叉。因为用一只餐叉很难吃到意大利面,所以假设哲学家必须用两只餐叉吃东西。他们只能使用自己左右手边的那两只餐叉。

解题思路

哲学家必须先拿一个叉子再拿另一个叉子,这种场景很容易发生死锁。假如每个哲学家饿时先拿左侧叉子再拿右侧叉子,那么问题来了,当哲学家拿到左侧叉子后右侧叉子正在被使用,哲学家是放下叉子还是等待右侧叉子。如果等待的话,假如在某个时刻五个哲学家同时拿到其左侧的叉子,这时五个叉子都被拥有,并且每个人都拿着自己左边的人所需要的叉子,同时又都等待着右边的人释放叉子,因为大家都在等待别人释放所以无人释放,从而导致死锁;那现在我们不等待,当我们无法拿到两把叉子时,我们释放手中叉子,然后等过段时间(假如五分钟)重新尝试,可是这样仍会出现问题,仍然假设五个哲学家同时拿到左侧叉子,同理五人都无法成功吃到意大利面,所以大家都放下手中叉子,然后过了五分钟大家又都重新尝试获取叉子,同理仍无法获取,再次释放手中叉子…这样一值重复下去,资源永远无法被任何人获取,从而饿死。

有一个可以解决上述死锁和避免饿死的方法,我们设置一个信号量标记等待的就餐的哲学家,当哲学家饥饿时要先等待,等待的哲学家不能超过4位,等待就餐的哲学家拿到两把叉子后解除等待然后就餐,如果只拿到一把叉子则等待获取另一把叉子,当哲学家饥饿时有4位哲学家在等待则无法进入等待状态,过段时间再进行尝试。

代码实现

见:https://github.com/kfcyh/threads/tree/master/philosopher

消费者生产者

https://github.com/kfcyh/threads/tree/master/producer_consumer

睡眠的理发师

https://github.com/kfcyh/threads/tree/master/barber

读者写者

https://github.com/kfcyh/threads/tree/master/reader_writer

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值