Linux下經典五位哲學家吃麵模型分析

2021-09-30 15:48:23 字數 1710 閱讀 7976

哲學家進餐問題是典型的同步問題。該問題是描述有五個哲學家共用一張圓桌,分別坐在周圍的五張椅子上,在圓桌上有一碗面和五隻筷子,他們的生活方式是交替地進行思考和進餐。平時,乙個哲學家進行思考,飢餓時便試圖取用其左右最靠近他的筷子,只有在他拿到兩隻筷子時才能進餐。進餐完畢,放下筷子繼續思考。如下圖所示:

選用互斥鎖mutex,如建立5個,pthread_mutex_t   m[5];

模型抽象:

5個哲學家 --> 5個執行緒; 5支筷子 --> 5把互斥鎖 int left(左手), right(右手)

5個哲學家使用相同的邏輯,可通用乙個執行緒主函式,void *tfn(void *arg),使用引數來表示執行緒編號:intthread_num= (int)arg;

哲學家執行緒根據編號知道自己是第幾個哲學家,而後選定鎖,鎖住,吃飯。否則哲學家thinking。

a   b   c   d   e

5支筷子,在邏輯上形成環: 0   1   2   3   4   分別對應5個哲學家:(一般邏輯如下圖所示)

所以有:

if (thread_num == 4) 

else

振盪:如果每個人都攥著自己左手的鎖,嘗試去拿右手鎖,拿不到則將鎖釋放。過會兒五個人又同時再攥著左手鎖嘗試拿右手鎖,依然拿不到。如此往復形成另外一種極端死鎖的現象——振盪。

避免振盪現象:只需5個人中,任意乙個人,拿鎖的方向與其他人相逆即可(如:e,原來:左:4,右:0 現在:左:0, 右:4)。

所以以上if else語句應改為:

if (thread_num == 4) //第五位哲學家和其他的哲學家不一樣,他是先搶右邊的筷子

else

而後, 首先應讓哲學家嘗試加左手鎖:

while

主線程(main)中,初始化5把鎖,銷毀5把鎖,建立5個執行緒(並將i傳遞給執行緒主函式),**5個執行緒。

避免死鎖的方法:

1. 當得不到所有所需資源時,放棄已經獲得的資源,等待。

2. 保證資源的獲取順序,要求每個執行緒獲取資源的順序一致。如:a獲取順序1、2、3;b順序應也是1、2、3。若b為3、2、1則易出現死鎖現象。

#include #include #include #include pthread_mutex_t m[5];  //定義5把互斥鎖

void *tfn(void *arg)

else

while (1)

pthread_mutex_unlock(&m[left]);//放下左邊筷子

sleep(rand() % 5);

} return null;

}int main(void)

執行結果:

五個哲學家問題

有五個哲學家,他們的生活方式是交替地進行思考和進餐。他們共用一張圓桌,分別坐在五張椅子上。在圓桌上有五個碗和五支筷子,平時乙個哲學家進行思考,飢餓時便試圖取用其左 右最靠近他的筷子,只有在他拿到兩支筷子時才能進餐。進餐完畢,放下筷子又繼續思考。哲學家進餐問題可看作是併發程序併發執行時處理共享資源的乙...

Linux下實現哲學家就餐問題

哲學家進餐問題是乙個多執行緒運用的經典例子,涉及到執行緒同步 互斥,臨界區訪問問題以及乙個避免死鎖的解決方法。有五個哲學家繞著圓桌坐,每個哲學家面前有一盤面,兩人之間有一支筷子,這樣每個哲學家左右各有一支筷子。哲學家有2個狀態,思考或者拿起筷子吃飯。如果哲學家拿到乙隻筷子,不能吃飯,直到拿到2只才能...

哲學家就餐 linux實現 Linux哲學的影響

哲學家就餐 linux實現 所有作業系統都有乙個理念。而且,作業系統的原理很重要。linux的哲學是什麼?它如何影響社群?多年來,它如何改變了軟體開發?不管我們是否知道,我們大多數人都有某種人生哲學。它可能很簡單,例如 對他人友善 或者可能是非常複雜的生活哲學。許多公司也有某種哲學。它們可能是未寫的...