哲學家吃飯問題2019 8 26

2021-09-26 13:50:16 字數 1681 閱讀 7312

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

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

模型抽象:

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

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

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

a b c d e

5支筷子,在邏輯上形成環: 0 1 2 3 4 分別對應5個哲學家:

所以有:

if(i == 4)

left = i, right = 0;

else

left = i, right = i+1;

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

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

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

if(i == 4)

left = 0, right = i;

else

left = i, right = i+1;

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

while

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

避免死鎖的方法:

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

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

**:

#include#include#include#includepthread_mutex_t chopstick[5]; //5把鎖,也就是5根筷子。

void*tfn(void *arg)

else

while(1)

printf("philosopher %d fetches chopstick %d\n",i,right);

printf("philosopher %d is eating.\n",i);

sleep(2); //吃飯

pthread_mutex_unlock(&chopstick[right]); //放下右手的筷子。

printf("philosopher %d release chopstick %d\n",i,right);

pthread_mutex_unlock(&chopstick[left]); //放下右手的筷子。

printf("philosopher %d release chopstick %d\n",i,left); }

}int main()

for( i = 0; i < 5; ++i)

return 0;

}

哲學家吃飯問題

code include include define people 5 define meat 10 肉塊的數量 static int tman people int n 1 定義n為共吃肉的數量 定義一些需要跟哲學家對應的陣列 static int thinking people 第n個哲學家在...

哲學家吃飯問題模擬(java寫的)

size large 這裡是兩種演算法,公用乙個chopstick類 chopstick類 size public class chopstick public chopstick string name public void setenable boolean enbl public boole...

哲學家問題

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