1. 程式人生 > >經典程序的同步問題-哲學家進餐問題

經典程序的同步問題-哲學家進餐問題

哲學家進餐問題

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

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還可以通過讓奇數哲學家拿左邊的筷子,偶數哲學家拿右邊的筷子,避免死鎖問題。