2023年,dijkstra提出並解決了乙個他稱之為哲學家進餐的同步問題。
「五個哲學家圍坐在一張圓桌周圍,每個哲學家的前面都有乙份通心麵,由於麵條很滑,必須使用2把叉子才能夾住。相鄰2份通心麵之間有1把叉子。哲學家的生活包括:吃飯、思考。當哲學家感覺餓了,他就試圖分2次取他左右的叉子,每次拿1把,但不分次序。如果成功獲得2把叉子,則開始吃飯,吃完放下叉子繼續思考。」
問題要求不能死鎖。
#define n 5#define left (i+n-1)%n
#define right (i+1)%n
#define thinking 0
#define hungry 0
#define eating 2
typedef int semaphore;
int state[n];
semaphore mutex=1;
semaphore s[n];
void philosopher(int i)
}void take_forks(int i)
void put_forks(int i)
void test(i)
}
訪問哲學家狀態陣列時進行互斥
當前哲學家餓了,且左右哲學家都沒有進餐時,設定訊號量。
之後根據訊號量(是否設定過)進行確定是否阻塞。
哲學家進餐問題
哲學家進餐問題 一 問題 5個哲學家圍坐在乙個圓桌上,每兩個哲學家之間都有乙隻筷子,哲學家平時進行思考,只有當他們飢餓時,才拿起筷子吃飯。規定每個哲學家只能先取其左邊筷子,然後取其右邊筷子,然後才可以吃飯。二 分析 每乙隻筷子都是乙個臨界資源,設定5個互斥訊號量。semaphore stcik 5 ...
哲學家進餐問題
一張圓桌上坐著5名哲學家,每兩個哲學家之間的桌上擺一根筷子,桌子的中間是一碗公尺飯,如圖所示。哲學家們傾注畢生精力用於思考和進餐,哲學家在思考時,並不影響他人。只有當哲學家飢餓的時候,才試圖拿起左 右兩根筷子 一根一根地拿起 如果筷子已在他人手上,則需等待。飢餓的哲學家只有同時拿到了兩根筷子才可以開...
哲學家進餐問題
哲學家進餐問題 五個哲學家共用一張圓桌,分別坐在周圍的五張椅子上,在桌子上有五隻碗和五隻筷子,他們的生活方式是交替地進行思考和進餐。平時,乙個哲學家進行思考,飢餓時便試圖取用其左右最靠近他的筷子,只有在他拿到兩隻筷子時才能進餐。進餐畢,放下筷子繼續思考 分析 放在桌子上的筷子是臨界資源,在一段時間內...