經典同步問題之哲學家進餐

問題描述:假設有5個哲學家,他們把一生都拿來思考和喫飯。他們共用一個圓桌喫飯,有一鍋米飯,每個人兩邊有兩根筷子。當某位哲學家思考時,他與其他同事不交互。時而,他會感到飢餓,並試圖拿起與他相近的左右兩根筷子。當5個哲學家同時飢餓,且同時那起一根的筷子,他們會永遠等待,陷入死鎖。就算沒有發生死鎖,也會發生“資源耗盡”。

分析:這是一個需要在多個進程之間分配多個資源且不會出現死鎖和飢餓的典型例子。

(死鎖4個條件:1、互斥訪問;2、請求保持;3、非剝奪;4、環路等待

而解決死鎖方法主要是死鎖預防,即打破死鎖必要條件中的一個。)



黑色數字:代表哲學家序號;

紅色數字:代表筷子序號;

而我對這個問題是這麼看的:哲學家們先左手拿起筷子,然後再右手拿起筷子,當兩個手都有筷子了,就可以進食了(我設定每個人進食時間都是隨機不同),然後再放下筷子。應該預防的問題是產生死鎖:比如每個哲學家左手都拿起左手邊的筷子,沒人肯放下筷子,造成誰都吃不了飯。



而我的具體代碼如下:(具體代碼有誤,正在修改中,請見諒。)



如果對wait()、sleep()、notify()不太瞭解的朋友,建議看看這篇博文,寫得很好:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章