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

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

五個哲學家公用一張圓桌, 分別坐在周圍的五張桌子上, 在圓桌上有五個碗和五隻筷子交叉排列, 它們的生活方式是交替的進行思考和進餐. 哲學家進行思考時不用筷子, 飢餓時取一隻他兩邊的任意一隻筷子(預設取左邊的筷子, 沒有時取右邊的, 都沒有時就取不了), 當他有兩隻筷子時就能進餐. 進餐後, 放下筷子繼續思考.若只有一隻筷子, 不放棄該筷子並等待擁有另一隻筷子時再進餐.

用一個訊號量表示一隻筷子, 共五個訊號量 semaphore chopsitck[5] = {1, 1, 1, 1, 1}; , 為 1 表示筷子未拿起, 為0表示筷子被拿起.那麼第i為科學家的進餐活動就可以描述為

法一:記錄型訊號量:

do {
    wait(chopstick[i]);
    wait(chopstick[(i + 1) % 5]);
    //eat
    signal(chopstick[i]);
    signal(chopstick[(i + 1) % 5]);
    //think
} while (true);

假設五位哲學家都要拿筷子(都拿左手邊), 那麼將沒有人可以 用餐, 就會陷入死鎖狀態.則哲學家進餐的解決方法:

1.至多允許四位哲學家拿同一邊的筷子, 則可讓至少一位哲學家先用餐, 用餐完後釋放筷子進而讓其他哲學家有機會用餐.

2.五位哲學家先競爭奇數(偶數)好筷子, 在競爭偶數(奇數)號筷子, 總會有一位哲學家能進餐.

法二: AND型訊號量

//AND型訊號量
semaphore chopstick[5] = {1, 1, 1, 1, 1};
do {
    //think
    Swait(chopsitck[(i + 1) % 5], chopsitck[i]);
    //eat
    Ssignal(chopsitck[(i + 1) % 5], chopsitck[i]);
} while (true);