有五個哲學家公用一張餐桌,分別坐在周圍的五張椅子上,在餐桌上有五個碗和五隻筷子,他們的生活方式是交替地進行思考和用餐。平時,乙個哲學家進行思考,飢餓時便試圖拿取其左右最靠近他的筷子,只有在他拿到兩隻筷子時才能進餐,進餐完畢,放下筷子繼續思考。
思路:選用互斥鎖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只才能吃飯,並且一次只能拿起身邊的一支筷子。一旦拿起便不會放下筷子直到把飯吃完,此時才把這雙筷子放回原處。...