经典同步问题之哲学家进餐

来源:互联网 发布:棒子 知乎 编辑:程序博客网 时间:2024/05/08 03:41

问题描述:假设有5个哲学家,他们把一生都拿来思考和吃饭。他们共用一个圆桌吃饭,有一锅米饭,每个人两边有两根筷子。当某位哲学家思考时,他与其他同事不交互。时而,他会感到饥饿,并试图拿起与他相近的左右两根筷子。当5个哲学家同时饥饿,且同时那起一根的筷子,他们会永远等待,陷入死锁。就算没有发生死锁,也会发生“资源耗尽”。

分析:这是一个需要在多个进程之间分配多个资源且不会出现死锁和饥饿的典型例子。

(死锁4个条件:1、互斥访问;2、请求保持;3、非剥夺;4、环路等待

而解决死锁方法主要是死锁预防,即打破死锁必要条件中的一个。)



黑色数字:代表哲学家序号;

红色数字:代表筷子序号;

而我对这个问题是这么看的:哲学家们先左手拿起筷子,然后再右手拿起筷子,当两个手都有筷子了,就可以进食了(我设定每个人进食时间都是随机不同),然后再放下筷子。应该预防的问题是产生死锁:比如每个哲学家左手都拿起左手边的筷子,没人肯放下筷子,造成谁都吃不了饭。



而我的具体代码如下:(具体代码有误,正在修改中,请见谅。)



如果对wait()、sleep()、notify()不太了解的朋友,建议看看这篇博文,写得很好:

http://blog.csdn.net/zyplus/article/details/6672775