哲學家就餐問題

2021-08-21 20:34:45 字數 1391 閱讀 4757

哲學家就餐問題是經典的死鎖問題

什麼是死鎖?

多個程序或執行緒相互等待對方的資源,在等到對方資源之前,也不會釋放自己的資源,這樣造成迴圈等待的現象,若無外力作用,他們都無法推進下去,這樣就產生了死鎖。

死鎖產生的必要條件:

防止死鎖的辦法:

這幾種方法只是理論上的,基本不可能實現

我們只能盡量的避免死鎖

經典的死鎖避免演算法:銀行家演算法

銀行家演算法了解一下:(四句話)

當顧客的資金需求少於銀行家現有的資金總量時,接納該顧客

顧客可以分期貸款,但貸款總量不能超過最大需求量

當銀行家現有資金不能滿足顧客需求時,可延遲交付,但總能在有限時間內讓顧客得到貸款

當顧客使用完全部資金後,一定要在有限時間內gui歸還全部資金。

下來我們具體看一下哲學家就餐問題如何解決:

為了不產生死鎖,我們必須保證拿左筷子和拿右筷子這兩步是乙個原子操作,此時我們就可以借助訊號量來實現,因為semop()這個函式具有原子性。

具體步驟如下:

1.訊號量集中設定5個訊號量

2.都設定初值為1(表示5個筷子的資源可用數)

3.除父程序外再建立4個子程序,每個程序代表乙個哲學家

4.每個程序都先申請自己需要的兩個筷子的資源(p操作)

5.使用結束後釋放(v操作)

**實現:

#include 

#include

#include

#include

#include

#include

union semun

;int semid;

//p操作

void get2kz(int

no),

};semop(semid,sb,2);

}//v操作

void put2kz(int

no),

};semop(semid,sb,2);

}void fun(int

no)}

int main()

int i=0;

//為訊號量集中的每個訊號量賦初值1

union semun su=;

for(i=0;i<5;i++)

//建立四個子程序,代表每個哲學家

intno=0;

for(i=1;i<5;i++)

}fun(no);

return

0;}

哲學家就餐問題

本文是哲學家就餐問題在 linux 上的程式實現,與windows 平台的實現類似,程式上稍有不同。philosopherdining.cpp include include include include include include rasutil.h using namespace std ...

哲學家就餐問題

pragma once include include include include include include include include include include include include include stdafx.h handle chopstick 5 room l...

哲學家就餐問題

假設有五位哲學家圍坐在一張圓形餐桌旁,做以下兩件事情之一 吃飯,或者思考。吃東西的時候,他們就停止思考,思考的時候也停止吃東西。餐桌中間有一大碗義大利面,每兩個哲學家之間有乙隻餐叉。因為用乙隻餐叉很難吃到義大利面,所以假設哲學家必須用兩隻餐叉吃東西。他們只能使用自己左右手邊的那兩隻餐叉。哲學家就餐問...