哲學家進餐問題

2022-06-02 04:42:10 字數 1477 閱讀 1160

哲學家進餐問題:

五個哲學家共用一張圓桌,分別坐在周圍的五張椅子上,在桌子上有五隻碗和五隻筷子,他們的生活方式是交替地進行思考和進餐。平時,乙個哲學家進行思考,飢餓時便試圖取用其左右最靠近他的筷子,只有在他拿到兩隻筷子時才能進餐。進餐畢,放下筷子繼續思考

分析:放在桌子上的筷子是臨界資源,在一段時間內只允許一位哲學家使用,為了實現對筷子的互斥訪問,可以用乙個訊號量表示筷子,由這五個訊號量構成訊號量陣列。

1 semaphore chopstick[5] = ;

2while(true)3

view code

為避免死鎖,可以使用以下三種策略:

策略一:至多只允許四個哲學家同時進餐,以保證至少有乙個哲學家能夠進餐,最終總會釋放出他所使用過的兩支筷子,從而可使更多的哲學家進餐。定義訊號量count,只允許4個哲學家同時進餐,這樣就能保證至少有乙個哲學家可以就餐。

1 semaphore chopstick[5]=;

2 semaphore count=4; //

設定乙個count,最多有四個哲學家可以進來

3void philosopher(inti)4

16 }

view code

策略二:僅當哲學家的左右兩支筷子都可用時,才允許他拿起筷子進餐。可以利用and 型訊號量機制實現,也可以利用訊號量的保護機制實現。利用訊號量的保護機制實現的思想是通過記錄型訊號量mutex對取左側和右側筷子的操作進行保護,使之成為乙個原子操作,這樣可以防止死鎖的出現。描述如下:

用記錄型訊號量實現:

1 semaphore mutex = 1; //

這個過程需要判斷兩根筷子是否可用,並保護起來

2 semaphore chopstick[5]=;

3void philosopher(inti)4

17 }

view code

用and型訊號量實現:

1 semaphore chopstick[5]=;2do

while(true)

view code

策略三:規定奇數號的哲學家先拿起他左邊的筷子,然後再去拿他右邊的筷子;而偶數號的哲學家則先拿起他右邊的筷子,然後再去拿他左邊的筷子。按此規定,將是1、2號哲學家競爭1號筷子,3、4號哲學家競爭3號筷子。即五個哲學家都競爭奇數號筷子,獲得後,再去競爭偶數號筷子,最後總會有乙個哲學家能獲得兩支筷子而進餐。

1 semaphore chopstick[5]=;

2void philosopher(inti)3

15else

//奇數哲學家,先左後右。

1623

}24 }

view code

感謝神犇:

哲學家進餐問題

哲學家進餐問題 一 問題 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...