哲學家就餐問題

2021-08-20 01:22:18 字數 1184 閱讀 6528

模擬有五個哲學家的哲學家進餐問題。

問題描述:哲學家的生活就是思考和吃飯,即思考,餓了就餐,再思考,迴圈往復。要求是:每乙個哲學家只有在拿到位於他左右的筷子後,才能夠就餐;哲學家只能先拿左邊的筷子,再去拿右邊的筷子,而不能同時去抓他兩邊的筷子,也不能從其他哲學家手中搶奪筷子;哲學家每次就餐後必須放下他手中的兩把筷子後恢復思考,不能強抓住餐具不放。 

以下給出了三種解決死鎖問題的方法,請仔細閱讀,選擇一種實現。

原理a:至多只允許四個哲學家同時進餐,以保證至少有乙個哲學家能夠進餐,最終總會釋放出他所使用過的兩支筷子,從而可使更多的哲學家進餐。將room作為訊號量,只允許4個哲學家同時進入餐廳就餐,這樣就能保證至少有乙個哲學家可以就餐,而申請進入餐廳的哲學家進入room的等待佇列。根據fifo的原則,總會進入就餐。因此不會出現餓死和死鎖的現象。

偽碼semaphore chopstick[5]=;

semaphore room=4;

void philosopher(int i)

}原理b:僅當哲學家的左右筷子都可用時,才允許他拿起筷子進餐。

方法1:利用and型訊號量機制實現:在乙個原語中,將一段**同時需要的多個臨界資源,要麼全部分配給它,要麼乙個都不分配,因此不會出現死鎖的情形。當某些資源不夠時阻塞呼叫程序;由於等待佇列的存在,使得對資源的請求滿足fifo的要求,因此不會出現飢餓的情形。

偽碼:semaphore chopstick[5]=;

void philosopher(int i)

}方法2:利用訊號的保護機制實現,通過訊號量mutex對eat()之前的取左側和右側筷子的操作進行保護,使之成為乙個原子操作這樣可以防止死鎖的出現。

偽碼:semaphore=1;

semaphore chopstick[5]=;

void philosopher(int i)

}原理c:規定奇數號的哲學家先拿起他左邊的筷子,然後再去拿他右邊的筷子;而偶數號的哲學家則相反。按此規定,將是1,2號哲學家競爭1號筷子,3,4號哲學家競爭3號筷子。即五個哲學家都競爭奇數號筷子,獲得後,再去競爭偶數號筷子,最後總會有乙個哲學家能獲得兩支筷子而進餐。而申請不到的哲學家進入阻塞等待佇列,跟fifo原則,則先申請的哲學家會較先可以吃飯,因此不會出現餓死的哲學家。

偽碼:semaphore chopstick[5]=;

void philosopher(int i)

else

}

哲學家就餐問題

本文是哲學家就餐問題在 linux 上的程式實現,與windows 平台的實現類似,程式上稍有不同。philosopherdining.cpp include include include include include include rasutil.h using namespace std ...

哲學家就餐問題

pragma once include include include include include include include include include include include include include stdafx.h handle chopstick 5 room l...

哲學家就餐問題

假設有五位哲學家圍坐在一張圓形餐桌旁,做以下兩件事情之一 吃飯,或者思考。吃東西的時候,他們就停止思考,思考的時候也停止吃東西。餐桌中間有一大碗義大利面,每兩個哲學家之間有乙隻餐叉。因為用乙隻餐叉很難吃到義大利面,所以假設哲學家必須用兩隻餐叉吃東西。他們只能使用自己左右手邊的那兩隻餐叉。哲學家就餐問...