哲學家進餐問題:有五個哲學家,他們的生活方式是交替地進行思考和進餐。哲學家們共用一張園桌,分別坐在周圍五張椅子上。在圓桌上五支筷子,平時一個哲學家進行思考,飢餓時便試圖取用其左右最靠近他的筷子,只有在他拿到兩支筷子時才能進餐。進程畢,放下筷子又繼續思考。
問題分析:
筷子是臨界資源,一次只能被一個哲學家使用。因此,五個人不能同時拿起左邊的筷子(或右邊)否則或引起死鎖。
解決方案:
(1)至多只允許四位哲學家同時拿左邊的筷子,最終保證有一位哲學家能夠進餐,並且用完能夠釋放筷子,讓更多的哲學家進餐。
(2)僅當哲學家左右兩只筷子都可以用的時候,才允許拿筷子進餐。
semaphore chopstick[5]={1,1,1,1,1};//五個信號量,一個信號量代表一只筷子 semaphore mutex=1; Pi(){ while(1){ wait(mutex);//設置信號量,防止其它人爭奪資源 wait(chopstick[i]); wait(chopstick[(i+1)%5]); signal(mutex);//拿到兩只筷子后釋放信號量 吃飯; signal(chopstick[i]);//吃過飯后,釋放筷子資源 signal(chopstick[(i+1)%5]); } }
(3)奇數號哲學家先拿左邊的,再拿右邊的;偶數則相反。即五位哲學家都先競爭奇數號筷子,獲得后再去競爭偶數號筷子,最終總會有一位哲學家有兩只筷子。
semaphore chopstick[5]={1,1,1,1,1}; Pi(){ while(1){ if(i%2!=0){//奇數號哲學家 wait(chopstick[i]);//拿左邊的 wait(chopstick[(i+1)%5]);//右邊的 }else{//偶數號哲學家 wait(chopstick[(i+1)%5]);//右邊的 wait(chopstick[i]);//左邊的 } 進餐; signal(chopstick[i]);//釋放筷子資源 signal(chopstick[(i+1)%5]); } }
