哲學家進餐問題:
五個哲學家共用一張圓桌,分別坐在周圍的五張椅子上,在桌子上有五隻碗和五隻筷子,他們的生活方式是交替地進行思考和進餐。平時,乙個哲學家進行思考,飢餓時便試圖取用其左右最靠近他的筷子,只有在他拿到兩隻筷子時才能進餐。進餐畢,放下筷子繼續思考
分析:放在桌子上的筷子是臨界資源,在一段時間內只允許一位哲學家使用,為了實現對筷子的互斥訪問,可以用乙個訊號量表示筷子,由這五個訊號量構成訊號量陣列。
1 semaphore chopstick[5] = ;view code2while(true)3
為避免死鎖,可以使用以下三種策略:
策略一:至多只允許四個哲學家同時進餐,以保證至少有乙個哲學家能夠進餐,最終總會釋放出他所使用過的兩支筷子,從而可使更多的哲學家進餐。定義訊號量count,只允許4個哲學家同時進餐,這樣就能保證至少有乙個哲學家可以就餐。
1 semaphore chopstick[5]=;view code2 semaphore count=4; //
設定乙個count,最多有四個哲學家可以進來
3void philosopher(inti)4
16 }
策略二:僅當哲學家的左右兩支筷子都可用時,才允許他拿起筷子進餐。可以利用and 型訊號量機制實現,也可以利用訊號量的保護機制實現。利用訊號量的保護機制實現的思想是通過記錄型訊號量mutex對取左側和右側筷子的操作進行保護,使之成為乙個原子操作,這樣可以防止死鎖的出現。描述如下:
用記錄型訊號量實現:
1 semaphore mutex = 1; //view code這個過程需要判斷兩根筷子是否可用,並保護起來
2 semaphore chopstick[5]=;
3void philosopher(inti)4
17 }
用and型訊號量實現:
1 semaphore chopstick[5]=;2doview codewhile(true)
策略三:規定奇數號的哲學家先拿起他左邊的筷子,然後再去拿他右邊的筷子;而偶數號的哲學家則先拿起他右邊的筷子,然後再去拿他左邊的筷子。按此規定,將是1、2號哲學家競爭1號筷子,3、4號哲學家競爭3號筷子。即五個哲學家都競爭奇數號筷子,獲得後,再去競爭偶數號筷子,最後總會有乙個哲學家能獲得兩支筷子而進餐。
1 semaphore chopstick[5]=;view code2void philosopher(inti)3
15else
//奇數哲學家,先左後右。
1623
}24 }
感謝神犇:
哲學家進餐問題
哲學家進餐問題 一 問題 5個哲學家圍坐在乙個圓桌上,每兩個哲學家之間都有乙隻筷子,哲學家平時進行思考,只有當他們飢餓時,才拿起筷子吃飯。規定每個哲學家只能先取其左邊筷子,然後取其右邊筷子,然後才可以吃飯。二 分析 每乙隻筷子都是乙個臨界資源,設定5個互斥訊號量。semaphore stcik 5 ...
哲學家進餐問題
一張圓桌上坐著5名哲學家,每兩個哲學家之間的桌上擺一根筷子,桌子的中間是一碗公尺飯,如圖所示。哲學家們傾注畢生精力用於思考和進餐,哲學家在思考時,並不影響他人。只有當哲學家飢餓的時候,才試圖拿起左 右兩根筷子 一根一根地拿起 如果筷子已在他人手上,則需等待。飢餓的哲學家只有同時拿到了兩根筷子才可以開...
python 哲學家進餐問題
import threading class diningphilosophers def init self self.cv threading.condition 字典物件,表示每個哲學家0,1,2,3,4的狀態,false表示未吃飯 self.d for i in range 5 self.d...