哲學(xué)家就餐問(wèn)題

場(chǎng)景:
原版的故事里有五個(gè)哲學(xué)家(不過(guò)我們寫的程序可以有N個(gè)哲學(xué)家)夹攒,這些哲學(xué)家們只做兩件事--思考和吃飯,他們思考的時(shí)候不需要任何共享資源胁塞,但是吃飯的時(shí)候就必須使用餐具咏尝,而餐桌上的餐具是有限的,原版的故事里啸罢,餐具是叉子编检,吃飯的時(shí)候要用兩把叉子把面條從碗里撈出來(lái)。很顯然把叉子換成筷子會(huì)更合理扰才,所以:一個(gè)哲學(xué)家需要兩根筷子才能吃飯允懂。
現(xiàn)在引入問(wèn)題的關(guān)鍵:這些哲學(xué)家很窮,只買得起五根筷子衩匣。他們坐成一圈蕾总,兩個(gè)人的中間放一根筷子。哲學(xué)家吃飯的時(shí)候必須同時(shí)得到左手邊和右手邊的筷子琅捏。如果他身邊的任何一位正在使用筷子生百,那他只有等著。
假設(shè)哲學(xué)家的編號(hào)是A柄延、B蚀浆、C、D搜吧、E市俊,筷子編號(hào)是1、2滤奈、3摆昧、4、5蜒程,哲學(xué)家和筷子圍成一圈如下圖所示:

#include <stdio.h>  
#include <stdlib.h>  
#include <memory.h>  
#include <pthread.h>  
#include <errno.h>  
#include <math.h>  
//筷子作為mutex  
pthread_mutex_t chopstick[6] ;  
void *eat_think(void *arg)  
{  
    char phi = *(char *)arg;  
    int left,right; //左右筷子的編號(hào)  
    switch (phi){  
        case 'A':  
            left = 5;  
            right = 1;  
            break;  
        case 'B':  
            left = 1;  
            right = 2;  
            break;  
        case 'C':  
            left = 2;  
            right = 3;  
            break;  
        case 'D':  
            left = 3;  
            right = 4;  
            break;  
        case 'E':  
            left = 4;  
            right = 5;  
            break;  
    }  
  
    int i;  
    for(;;){  
        usleep(3); //思考  
        pthread_mutex_lock(&chopstick[left]); //拿起左手的筷子  
        printf("Philosopher %c fetches chopstick %d\n", phi, left);  
        if (pthread_mutex_trylock(&chopstick[right]) == EBUSY){ //拿起右手的筷子     
            pthread_mutex_unlock(&chopstick[left]); //如果右邊筷子被拿走放下左手的筷子  
            continue;  
        }  
          
    //  pthread_mutex_lock(&chopstick[right]); //拿起右手的筷子绅你,如果想觀察死鎖,把上一句if注釋掉搞糕,再把這一句的注釋去掉  
        printf("Philosopher %c fetches chopstick %d\n", phi, right);  
        printf("Philosopher %c is eating.\n",phi);  
        usleep(3); //吃飯  
        pthread_mutex_unlock(&chopstick[left]); //放下左手的筷子  
        printf("Philosopher %c release chopstick %d\n", phi, left);  
        pthread_mutex_unlock(&chopstick[right]); //放下左手的筷子  
        printf("Philosopher %c release chopstick %d\n", phi, right);  
  
    }  
}  
int main(){  
    pthread_t A,B,C,D,E; //5個(gè)哲學(xué)家  
  
    int i;  
    for (i = 0; i < 5; i++)  
        pthread_mutex_init(&chopstick[i],NULL);  
    pthread_create(&A,NULL, eat_think, "A");  
    pthread_create(&B,NULL, eat_think, "B");  
    pthread_create(&C,NULL, eat_think, "C");  
    pthread_create(&D,NULL, eat_think, "D");  
    pthread_create(&E,NULL, eat_think, "E");  
  
    pthread_join(A,NULL);  
    pthread_join(B,NULL);  
    pthread_join(C,NULL);  
    pthread_join(D,NULL);  
    pthread_join(E,NULL);  
    return 0;  
}  

注意:

  1. gcc編譯時(shí)勇吊,加上-lphread選項(xiàng),例:gcc eating.c -lpthread
    2.pthread_create的第四個(gè)參數(shù)是void *類型窍仰,我一開(kāi)始傳一個(gè)char類型汉规,即'A',就會(huì)發(fā)生段錯(cuò)誤。但改成char *,即“A”就沒(méi)問(wèn)題了针史。
    3.usleep是毫秒級(jí)的阻塞
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晶伦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子啄枕,更是在濱河造成了極大的恐慌婚陪,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件频祝,死亡現(xiàn)場(chǎng)離奇詭異泌参,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)常空,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門沽一,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人漓糙,你說(shuō)我怎么就攤上這事铣缠。” “怎么了昆禽?”我有些...
    開(kāi)封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵蝗蛙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我醉鳖,道長(zhǎng)捡硅,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任辐棒,我火速辦了婚禮病曾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漾根。我一直安慰自己,他們只是感情好鲫竞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布辐怕。 她就那樣靜靜地躺著,像睡著了一般寄疏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上僵井,一...
    開(kāi)封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天陕截,我揣著相機(jī)與錄音,去河邊找鬼批什。 笑死,一個(gè)胖子當(dāng)著我的面吹牛形葬,可吹牛的內(nèi)容都是我干的笙以。 我是一名探鬼主播猖腕,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了逻炊?” 一聲冷哼從身側(cè)響起余素,我...
    開(kāi)封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤视乐,失蹤者是張志新(化名)和其女友劉穎佑淀,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體捧颅,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碉哑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了设塔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖例诀,靈堂內(nèi)的尸體忽然破棺而出裁着,到底是詐尸還是另有隱情扔罪,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站倔矾,受9級(jí)特大地震影響禁熏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宙彪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一男图、第九天 我趴在偏房一處隱蔽的房頂上張望栈戳。 院中可真熱鬧,春花似錦褂痰、人聲如沸偏化。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)沈条。三九已至蜡歹,卻和暖如春汗洒,著一層夾襖步出監(jiān)牢的瞬間瞻凤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炕吸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓雏掠,卻偏偏與公主長(zhǎng)得像摧玫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坏挠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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

  • 這是以前寫的一篇文章吕晌,今天發(fā)布出來(lái)該問(wèn)題涉及多線程的內(nèi)容聂使,可以看我的這篇文章 POSIX多線程初步GitHub 地...
    南山腳下一棵樹(shù)閱讀 4,273評(píng)論 0 1
  • 前言 這是我第一眼看到該問(wèn)題時(shí)想到的解決方式之一弃理,不知道可不可行,如果大家有什么看法可以探討探討炬转。 問(wèn)題描述 有五...
    Maxi_Mao閱讀 2,621評(píng)論 1 1
  • 死鎖的四個(gè)條件:(1) 互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用扼劈。(2) 請(qǐng)求與保持條件:一個(gè)進(jìn)程因請(qǐng)求資源而阻塞...
    icecrea閱讀 11,059評(píng)論 3 7
  • 之前一直很少用到條件變量,最近看了看,順便嘗試寫了寫哲學(xué)家就餐問(wèn)題薯蝎。 問(wèn)題描述 如圖占锯,五個(gè)哲學(xué)家圍著圓桌吃意面烟央,每...
    NeverLee閱讀 802評(píng)論 0 0
  • 問(wèn)題描述 方案一: 該方案能滿足大多數(shù)情況识藤,但仍存在這么個(gè)情況,5個(gè)哲學(xué)家同時(shí)拿起左邊的刀叉痴昧,那么會(huì)導(dǎo)致沒(méi)有人可以...
    大海孤了島閱讀 2,159評(píng)論 0 2