【專項專攻】01-哲學家進餐問題

前言:

image.png

當一位哲學家思考時,他與其他同事不交流德频。時而,他會感到饑餓缩幸,并試圖拿起與他相近的兩根筷子(筷子在他和他的左或右鄰居之間)壹置。一個哲學家一次只能拿起一根筷子。顯然表谊,他不能從其他哲學家手里拿走筷子钞护。當一個饑餓的哲學家同時擁有兩根筷子時,他就能吃爆办。在吃完后难咕,他會放下兩根筷子,并開始思考距辆。

哲學家就餐問題是一個經(jīng)典的同步問題余佃,這不是因為其本身的實際重要性,也不是因為計算機科學家不喜歡哲學家跨算,而是因為它是大量并發(fā)控制問題的一個例子爆土。這個代表型的例子滿足:在多個進程之間分配多個資源,而且不會出現(xiàn)死鎖和饑餓诸蚕。

哲學家進餐問題:
(一)問題:
5個哲學家圍坐在一個圓桌上步势,每兩個哲學家之間都有一只筷子氧猬,哲學家平時進行思考,只有當他們饑餓時坏瘩,才拿起筷子吃飯盅抚。
規(guī)定每個哲學家只能先取其左邊筷子,然后取其右邊筷子倔矾,然后才可以吃飯泉哈。

(二)分析:
每一只筷子都是一個臨界資源,設(shè)置5個互斥信號量破讨。
Semaphore stcik[5]={1,1,1,1,1}

因為:只有占有左邊筷子-》占有右邊筷子-》吃飯
所以p(左邊筷子)-》p(右邊筷子)-》吃飯

(三)實現(xiàn):
main(){
philosopher(0);//注意不可以用循環(huán),因為此中是4個并列的進程奕纫。
philosopher(1);
philosopher(2);
philosopher(3);
philosopher(4);
}

philosopher(int i){
while(1){
思考提陶;
p(stick[i]);//取左邊筷子
p(stick[i+1]);//取右邊筷子

進餐;
V(stick[i]);
v(stick[i+1]);
}
}

(四)問題:
如果5個哲學家同時拿起自己左邊的筷子匹层,就會發(fā)生死鎖隙笆。

(五)防止死鎖的方法:

(1)方法一:
規(guī)定在拿到左側(cè)的筷子后,先檢查右面的筷子是否可用升筏。如果不可用撑柔,則先放下左側(cè)筷子, 等一段時間再重復(fù)整個過程您访。

問題:發(fā)生饑餓現(xiàn)象铅忿;
如果同時拿起左邊筷子,則右邊的筷子都不可用灵汪,則放下檀训,然后再次拿起,享言。峻凫。。览露,則誰都無法就餐荧琼,

(2)方法二:
最多允許四個哲學家同時進餐,以保證至少有一個哲學家能夠進餐,最終總會釋
放出他所使用過的兩支筷子,從而可使更多的哲學家進餐。

偽碼:
semaphore chopstick[5]={1差牛,1命锄,1,1多糠,1};
semaphore room=4;
void philosopher(int i)
{
while(true)
{
think();
wait(room); //請求進入房間進餐
wait(chopstick[i]); //請求左手邊的筷子
wait(chopstick[(i+1)%5]); //請求右手邊的筷子
eat();
signal(chopstick[(i+1)%5]); //釋放右手邊的筷子
signal(chopstick[i]); //釋放左手邊的筷子
signal(room); //退出房間釋放信號量room
}
}

(3)將拿左筷子累舷,與拿右筷子當做一個原子操作:(即只有當左右筷子均可以拿到時,才拿筷子夹孔。)

方法一:
利用AND 型信號量機制實現(xiàn):根據(jù)課程講述被盈,在一個原語中析孽,將一段代碼同時需
要的多個臨界資源,要么全部分配給它只怎,要么一個都不分配袜瞬,因此不會出現(xiàn)死鎖的情形。

偽碼:
semaphore chopstick[5]={1身堡,1邓尤,1,1贴谎,1};
void philosopher(int I)
{
while(true)
{
think();
P(chopstick[(I+1)]%5,chopstick[I]);
eat();
V(chopstick[(I+1)]%5,chopstick[I]);
}
}

方法二:
利用信號量的保護機制實現(xiàn)汞扎。通過信號量mutex對eat()之前的取左側(cè)和右側(cè)筷
子的操作進行保護,使之成為一個原子操作擅这,這樣可以防止死鎖的出現(xiàn)澈魄。

偽碼:
semaphore mutex = 1 ;
semaphore chopstick[5]={1,1仲翎,1痹扇,1,1};
void philosopher(int I)
{
while(true)
{
think();
P(mutex);
P(chopstick[(I+1)]%5);
P(chopstick[I]);
V(mutex);

eat();
V(chopstick[(I+1)]%5);
V(chopstick[I]);
}
}

(4)規(guī)定奇數(shù)號的哲學家先拿起他左邊的筷子溯香,然后再去拿他右邊的筷子;而偶數(shù)號 的哲學家則相反鲫构。
偽碼:
semaphore chopstick[5]={1,1玫坛,1结笨,1,1};
void philosopher(int i)
{
while(true)
{
think();
if(i%2 == 0) //偶數(shù)哲學家湿镀,先右后左禀梳。
{
P (chopstick[ i + 1 ] mod 5) ;
P (chopstick[ i]) ;
eat();
V (chopstick[ i + 1 ] mod 5) ;
V (chopstick[ i]) ;
}
Else //奇數(shù)哲學家,先左后右肠骆。
{
p (chopstick[ i]) ;
p (chopstick[ i + 1 ] mod 5) ;
eat();
V (chopstick[ i]) ;
V (chopstick[ i + 1 ] mod 5) ;
}
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末算途,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚀腿,更是在濱河造成了極大的恐慌嘴瓤,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莉钙,死亡現(xiàn)場離奇詭異廓脆,居然都是意外死亡,警方通過查閱死者的電腦和手機磁玉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門停忿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚊伞,你說我怎么就攤上這事席赂∷泵” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵颅停,是天一觀的道長谓晌。 經(jīng)常有香客問我,道長癞揉,這世上最難降的妖魔是什么纸肉? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮喊熟,結(jié)果婚禮上柏肪,老公的妹妹穿的比我還像新娘。我一直安慰自己芥牌,他們只是感情好预吆,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胳泉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岩遗。 梳的紋絲不亂的頭發(fā)上扇商,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音宿礁,去河邊找鬼案铺。 笑死,一個胖子當著我的面吹牛梆靖,可吹牛的內(nèi)容都是我干的控汉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼返吻,長吁一口氣:“原來是場噩夢啊……” “哼姑子!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起测僵,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤街佑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后捍靠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沐旨,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年榨婆,在試婚紗的時候發(fā)現(xiàn)自己被綠了磁携。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡良风,死狀恐怖谊迄,靈堂內(nèi)的尸體忽然破棺而出闷供,到底是詐尸還是另有隱情,我是刑警寧澤鳞上,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布这吻,位于F島的核電站,受9級特大地震影響篙议,放射性物質(zhì)發(fā)生泄漏唾糯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一鬼贱、第九天 我趴在偏房一處隱蔽的房頂上張望移怯。 院中可真熱鬧,春花似錦这难、人聲如沸舟误。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嵌溢。三九已至,卻和暖如春蹋岩,著一層夾襖步出監(jiān)牢的瞬間赖草,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工剪个, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秧骑,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓扣囊,卻偏偏與公主長得像乎折,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子侵歇,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容