linux多執行緒 3 哲學家用餐 mutex實現

2021-06-14 05:46:13 字數 1530 閱讀 5016

ref:

5跟筷子,5個哲學家,哲學家要吃飯,自然要兩根筷子,這樣就出現資源爭用的情況。哲學家只能用左邊和右邊的筷子,兩根筷子備齊才能吃飯!

使用mutex的話,就是每個筷子乙個mutex,需要5個mutex,哲學家先lock左邊的筷子,如果有人已經在用那根筷子了,那就等著,不然左邊的筷子就拿到手了,然後去拿右邊的筷子,如果拿到了,那就開飯!如果拿不到,那就等一下再嘗試,嘗試累計10次的話,乾脆放棄,把左邊的筷子也放回去讓別人先吃了再說!

如何檢測是否真的lock成功了呢?那就是給筷子賦值,把自己的編號賦值給兩根筷子,然後usleep一下,這個時候很可能執行緒排程,cpu把機會給了別的執行緒,假如沒有lock住,那麼可能筷子的值會發生意外的修改。假如一直沒有被錯誤的修改,那麼應該就已經lock 成功了咯!

在沒有使用同步時,會發生很多意外修改的情況:

#include #include //#include#include#define n 5

#define m 10

int cholk[n];

pthread_mutex_t mt[n];

void *func(void *);

int main()

{ pthread_t person[n];

int i;

//init thread

for(i=0;i

同步以後:

注意:1.lock第乙個筷子的時候,最好用pthread_mutex_lock,用try_lock的話應該用while迴圈加延時,但是這樣的話try_lock就會反覆去輪詢,導致效率降低,而pthread_mutex_lock則會一直阻塞,就這麼等著,不占用cpu時間。用try_lock,while迴圈,中間加入延時,效率有所改善,不然好多時間都消耗在輪詢裡。可見,多執行緒不僅要編的對,還要編的高效,需要對同步機制有細緻的了解。

2.另外,有幾次測試的時候,發現只有1和3交替吃飯,別人都沒得吃!可能是其他兩個usleep沒有加入,所以呢,執行緒切換的時候,大部分都是在臨界區里被切換出去,那麼其他執行緒鎖不住,最後還是切換回來,導致有的執行緒一直搶不到啊。

下圖是0和2有飯吃,別的沒得吃,這個是把所有usleep都注釋掉的結果。

unlock以後usleep一下,就不會發生這種情況了。

哲學家用餐問題

哲學家用餐問題,怎麼樣保證沒有死鎖,最直接的乙個方案就是要保證,每乙個哲學家在拿筷子的時候,左右兩邊都能拿到,才去拿,如果不能保證那就乙個筷子都不拿。對與這個問題的實現,可以設定五個訊號量,標識筷子是否可以拿。具體 如下。public static class person implements r...

哲學家用餐問題

哲學家用餐問題,5位哲學家坐在圓桌旁,每對哲學家之間只有一根筷子。如果乙個哲學家可以拿起他旁邊的兩根筷子,他就可以吃東西。一根筷子可以由其相鄰的任何乙個哲學家拿起,但不能同時被兩個哲學家拿起。如果遵循乙個簡單的規則,就可以避免死鎖 讓所有執行緒以相同的順序宣告並釋放其鎖。這樣,您永遠不會陷入可能發生...

哲學家用餐問題

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