經典程序的同步問題-哲學家進餐問題
阿新 • • 發佈:2018-11-22
哲學家進餐問題
五個哲學家共用一張圓桌,分別坐在周圍的五張椅子上,在桌子上有五隻碗和五隻筷子,他們的生活方式是交替地進行思考和進餐。平時,一個哲學家進行思考,飢餓時便試圖取用其左右最靠近他的筷子,只有在他拿到兩隻筷子時才能進餐。進餐畢,放下筷子繼續思考。
1.讓一個哲學家先不吃。
semaphore chopstick[5]={1,1,1,1,1}; //第i位哲學家 do{ wait(num)//num=4表示允許最多同時吃飯的哲學家是數量。 wait(chopstick[i]);//拿筷子 wait(chopstick[(i+1)%5]); ... //eat ... signal(chopstick[i]);//放筷子 signal(chopstick[(i+1)%5]); signal(num); ... //think ... }while(TRUE);
2.上面的方法通過限制數量避免了死鎖問題,我們還可以通過AND訊號量。
Var chopstick: array [0, …, 4] of semaphore:=(1, 1, 1, 1, 1); Process i repeat think; Swait(chopstick[ ( i +1) mod 5] , chopstick[ i ] ); eat; Ssignal(chopstick[ ( i +1) mod 5] , chopstick[ i ] ); until false;
3還可以通過讓奇數哲學家拿左邊的筷子,偶數哲學家拿右邊的筷子,避免死鎖問題。