2 18哲學家問題

2021-10-04 18:46:25 字數 1025 閱讀 6820

一張桌子上有5名哲學家,每兩個哲學家之間的桌子上有一根筷子,桌子中間是水煮魚。哲學家們傾注畢生的經歷用於思考和進餐,哲學家在思考時,並不影響他人。只有當哲學家飢餓時,才會試圖拿起左右兩根筷子(一根,一根地拿起)。如果筷子已經在其他人手上,則需要等待。飢餓的哲學家只有同時拿起兩根筷子才可以開始進餐,當進餐完畢後,放下筷子繼續思考

1,關係分析:系統中有5個哲學家程序,5位哲學家與左右鄰居對中間筷子的訪問是互斥關係。

3,訊號量的設定:定義互斥訊號量陣列chopsticks[5]=用於實現對5根筷子的互斥訪問。並對哲學家按0~4編號,哲學家i左邊的筷子編號為i,右邊的筷子編號為(i+1)%5

問題:如果5個哲學家同時進餐,且在0號哲學家拿起左邊筷子時,發生程序切換到1號哲學家拿起左邊筷子,又發生程序切換...最終5個哲學家都拿起左邊的筷子,每個哲學家都在等待其他哲學家放下筷子,自己不放下筷子的死鎖現象

解決方法一:對哲學家程序新增一些限制條件,比如最多執行四個哲學家同時進餐,這樣就可以保證至少有乙個哲學家可以進餐,進餐完成後放下兩根筷子,啟用旁邊堵塞的哲學家程序。。。所有哲學家都可以進餐

解決方法二:要求奇數號的哲學家先拿左邊的筷子,然後再拿右邊的筷子,二偶數號哲學家剛好相反。用這種方法可以保證如果相鄰兩個奇偶號哲學家都想吃飯,那麼自會有其中乙個哲學家拿起第一只筷子,另外乙個沒有拿起筷子的哲學家程序會直接堵塞,這就避免了哲學家占有乙隻筷子後等待另乙隻的情況、

解決方法三:僅當乙個哲學家左右兩邊筷子都可以使用時才允許其進餐。

方法三的**實現:

semaphore chopstick[5]=;

semaphore mutex=1; //互斥的訪問筷子

pi()

}

假設1號哲學家拿起了,左邊1號筷子和右邊2號筷子,就會對兩隻筷子執行p操作使得其他程序不能對他們訪問,如果1號哲學家在吃飯時,發生了程序切換2號哲學家,它在拿起左邊2號筷子時就會被堵塞,並不會拿起3號筷子占用資源。

哲學家問題

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

哲學家就餐問題

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

哲學家進餐問題

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