五個哲學家問題

2021-08-19 00:19:19 字數 1299 閱讀 6392

有五個哲學家,他們的生活方式是交替地進行思考和進餐。他們共用一張圓桌,分別坐在五張椅子上。

在圓桌上有五個碗和五支筷子,平時乙個哲學家進行思考,飢餓時便試圖取用其左、右最靠近他的筷子,只有在他拿到兩支筷子時才能進餐。進餐完畢,放下筷子又繼續思考。

哲學家進餐問題可看作是併發程序併發執行時處理共享資源的乙個有代表性的問題。

此演算法可以保證不會有相鄰的兩位哲學家同時進餐。

若五位哲學家同時飢餓而各自拿起了左邊的筷子,這使五個訊號量 chopstick 均為 0,當他們試圖去拿起右邊的筷子時,都將因無筷子而無限期地等待下去,即可能會引起死鎖。

至多只允許四位哲學家同時去拿左筷子,最終能保證至少有一位哲學家能進餐,並在用完後釋放兩隻筷子供他人使用。

設定乙個初值為 4 的訊號量 r,只允許 4 個哲學家同時去拿左筷子,這樣就能保證至少有乙個哲學家可以就餐,不會出現餓死和死鎖的現象。

僅當哲學家的左右手筷子都拿起時才允許進餐。

解法 1:利用 and 型訊號量機制實現。

原理:多個臨界資源,要麼全部分配,要麼乙個都不分配,因此不會出現死鎖的情形。

解法 2:利用訊號量的保護機制實現。

原理:通過互斥訊號量 mutex 對 eat() 之前取左側和右側筷子的操作進行保護,可以防止死鎖的出現。

規定奇數號哲學家先拿左筷子再拿右筷子,而偶數號哲學家相反。

原理:按照下圖,將是 2,3 號哲學家競爭 3 號筷子,4,5 號哲學家競爭 5 號筷子。1 號哲學家不需要競爭。最後總會有乙個哲學家能獲得兩支筷子而進餐。

哲學家問題

問題描述 有五個哲學家繞著圓桌坐,每個哲學家面前有一盤面,兩人之間有一支筷子,這樣每個哲學家左右各有一支筷子。哲學家有2個狀態,思考或者拿起筷子吃飯。如果哲學家拿到乙隻筷子,不能吃飯,直到拿到2只才能吃飯,並且一次只能拿起身邊的一支筷子。一旦拿起便不會放下筷子直到把飯吃完,此時才把這雙筷子放回原處。...

哲學家就餐問題

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

哲學家進餐問題

哲學家進餐問題 一 問題 5個哲學家圍坐在乙個圓桌上,每兩個哲學家之間都有乙隻筷子,哲學家平時進行思考,只有當他們飢餓時,才拿起筷子吃飯。規定每個哲學家只能先取其左邊筷子,然後取其右邊筷子,然後才可以吃飯。二 分析 每乙隻筷子都是乙個臨界資源,設定5個互斥訊號量。semaphore stcik 5 ...