1.大家都记得这个关于死锁的经典例子吧,就是说譬如:5个哲学家围坐在一个桌上,每个左右分别有一个叉子,每个哲学家就餐时就得先从左边然后到右边拿叉子.当思考的时候就放下左右两个叉子.
现在的版本是:当哲学家用完叉子的时候,他们把叉子放在一个筷笼里.当哲学家要就餐的时候,他们就从筷笼里取出下两根可用的筷子.请问:这能消除死锁的可能吗?仅仅通过减少可用的筷子数目就能重新引入死锁吗?(我觉得第一个问题总是不会死锁.因为它已经缺少了循环等待资源这个条件,但从生活上又觉得这会死锁,真的迷糊了!)2.在一个餐馆中,假如:一个厨师,几个服务员,当有顾客来下订单时,服务员就得把订单交由该厨师.然后厨师把菜做好后就把原订单交给一个正在等待的服务员(可能几个服务员都在等,此时就用notifyAll()),但要指明是哪一个服务员区获得了订单.(这个问题希望大家能提供一个源码)
谢谢了!!
现在的版本是:当哲学家用完叉子的时候,他们把叉子放在一个筷笼里.当哲学家要就餐的时候,他们就从筷笼里取出下两根可用的筷子.请问:这能消除死锁的可能吗?仅仅通过减少可用的筷子数目就能重新引入死锁吗?(我觉得第一个问题总是不会死锁.因为它已经缺少了循环等待资源这个条件,但从生活上又觉得这会死锁,真的迷糊了!)2.在一个餐馆中,假如:一个厨师,几个服务员,当有顾客来下订单时,服务员就得把订单交由该厨师.然后厨师把菜做好后就把原订单交给一个正在等待的服务员(可能几个服务员都在等,此时就用notifyAll()),但要指明是哪一个服务员区获得了订单.(这个问题希望大家能提供一个源码)
谢谢了!!
因此,如果使用记录型信号量,可以有几个解决办法:
1)至多四个哲学家同时吃饭。那一个就让他饿着。
2)判断,只有两根筷子同时可用时,才能拿起。
3)仅允许奇数号拿左边的筷子,其他的先拿右边的筷子。
这样可以如下解决:
var chopstick:array[0,1,2,3,4] of semaphore;所有信号量被初始化为1,第i个哲学家的活动可以描述为:
repeat
wait(chopstick[i]);
wait(chopstick[(i+1)mod5]);
eat; signal(chopstick[i]);
signal(chopstick[(i+1)mod5]); think;
util false;这样交替执行P,V操作就可以实现解决同步问题。也可以使用管程机制来实现。但是也需要引入一个新的数据结构:想吃饭状态。这样就有三种状态。
其他情况还要大家补充。