哲學(xué)家就餐問題

問題描述
哲學(xué)家就餐問題
方案一:
#define N 5 //哲學(xué)家個(gè)數(shù)
semaphore fork[5]; //信號(hào)量初始值為1

void philosopher(int i){ //哲學(xué)家編號(hào):0-4
    while(true){
        think();            //哲學(xué)家在思考
        P(fork[i]);         //去拿左邊的叉子
        P(fork[(i+1)%N]);   //去拿右邊的叉子
        eat();              //吃面條中
        V(fork[i]);         //放下左邊的叉子
        V(fork[(i+1)%N]);   //放下右邊的叉子
    }
}

該方案能滿足大多數(shù)情況,但仍存在這么個(gè)情況,5個(gè)哲學(xué)家同時(shí)拿起左邊的刀叉,那么會(huì)導(dǎo)致沒有人可以吃面條,導(dǎo)致死鎖。

方案二:使用一個(gè)信號(hào)量,保證只有一個(gè)人就餐
#define N 5 //哲學(xué)家個(gè)數(shù)
semaphore fork[5]; //信號(hào)量初始值為1
semaphore mutex;    //互斥信號(hào)量,初始值為1
void philosopher(int i){ //哲學(xué)家編號(hào):0-4
    while(true){
        think();            //哲學(xué)家在思考
        P(mutex);           //進(jìn)入臨界區(qū)

        P(fork[i]);         //去拿左邊的叉子
        P(fork[(i+1)%N]);   //去拿右邊的叉子
        eat();              //吃面條中
        V(fork[i]);         //放下左邊的叉子
        V(fork[(i+1)%N]);   //放下右邊的叉子

        V(mutex);           //退出臨界區(qū)
    }
}

該方案是正確的,不存在死鎖,但效率很低。

方案三:設(shè)置哲學(xué)家拿刀叉的時(shí)候存在差異,分奇偶來確定拿刀叉的方式
#define N 5 //哲學(xué)家個(gè)數(shù)
semaphore fork[5]; //信號(hào)量初始值為1
void philosopher(int i){ //哲學(xué)家編號(hào):0-4
    while(true){
        think();            //哲學(xué)家在思考
        if (i % 2 == 0){
            P(fork[i]);         //去拿左邊的叉子
            P(fork[(i+1)%N]);   //去拿右邊的叉子
        } else {
            P(fork[(i+1)%N]);   //去拿右邊的叉子
            P(fork[i]);         //去拿左邊的叉子
        }

        eat();              //吃面條中
        V(fork[i]);         //放下左邊的叉子
        V(fork[(i+1)%N]);   //放下右邊的叉子
    }
}

注意:這里只需要對(duì)P操作進(jìn)行分類,對(duì)V操作不需要進(jìn)行分類,因?yàn)閂操作是不會(huì)阻塞的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 這是以前寫的一篇文章,今天發(fā)布出來該問題涉及多線程的內(nèi)容,可以看我的這篇文章 POSIX多線程初步GitHub 地...
    南山腳下一棵樹閱讀 4,357評(píng)論 0 1
  • 死鎖的四個(gè)條件:(1) 互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用。(2) 請(qǐng)求與保持條件:一個(gè)進(jìn)程因請(qǐng)求資源而阻塞...
    icecrea閱讀 11,108評(píng)論 3 7
  • 前言 這是我第一眼看到該問題時(shí)想到的解決方式之一,不知道可不可行,如果大家有什么看法可以探討探討。 問題描述 有五...
    Maxi_Mao閱讀 2,666評(píng)論 1 1
  • 之前一直很少用到條件變量,最近看了看,順便嘗試寫了寫哲學(xué)家就餐問題。 問題描述 如圖,五個(gè)哲學(xué)家圍著圓桌吃意面,每...
    NeverLee閱讀 837評(píng)論 0 0
  • 場(chǎng)景:原版的故事里有五個(gè)哲學(xué)家(不過我們寫的程序可以有N個(gè)哲學(xué)家),這些哲學(xué)家們只做兩件事--思考和吃飯,他們思考...
    哈哈哈_哈哈哈閱讀 889評(píng)論 0 3