哲學家就餐問題

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

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

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

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

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

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

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

方案三:設置哲學家拿刀叉的時候存在差異,分奇偶來確定拿刀叉的方式
#define N 5 //哲學家個數(shù)
semaphore fork[5]; //信號量初始值為1
void philosopher(int i){ //哲學家編號:0-4
    while(true){
        think();            //哲學家在思考
        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]);   //放下右邊的叉子
    }
}

注意:這里只需要對P操作進行分類,對V操作不需要進行分類,因為V操作是不會阻塞的。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容