死鎖和飢餓 哲學家就餐問題

2021-09-29 08:31:20 字數 1611 閱讀 7867

假設5位哲學家住在一起(可以推廣到n),每天生活就是思考和吃飯,每位哲學家需要2把叉子來吃義大利面.

就餐安排:一張圓桌,5個板凳,5個盤子,5把叉子,每個想吃飯的哲學家做到椅子上,使用盤子2側的叉子來吃麵條,

問題: 設計演算法保證互斥(2位哲學家不能使用相鄰的叉子),同時還要避免死鎖(每個哲學家都在等待叉子,且占用了叉子)和飢餓

訊號量解決方案

semaphore fork[5]

=;int i;

void philosopher (

int i)

}void

mian()

對上面死鎖危險的解決方案:

再增加5把叉子,

哲學家學會只使用一把叉子吃麵增加服務員:限制每次最多只能4個哲學家坐下來,那麼至少有乙個哲學家能夠拿到2把叉子

增加服務員方案

semaphore fork[5]

=;semaphore room =4;

int i;

void philosopher (

int i)

}void

main()

基於管程的解決方案
定義5個管程的條件變數, 每把叉子對應乙個條件變數,用來標識哲學家 等待 的叉子可用情況,

開乙個bool陣列記錄每把叉子是否可用(true/false)

管程包含2個過程

get_forks : 表示取哲學家左右的叉子, 如果至少有1把不可以用,那麼在條件變數佇列中等待,使得其他哲學家程序進入管程release_forks : 標識2把叉子可用

訊號量方案類似,都是首先拿起左邊的叉子,然後拿起右邊的叉子

monitor dining_controller;

// 宣告管程

cron forkready[5]

;// 管程的條件變數

bool fork[5]

=;// 標記叉子是否可用

void

get_forks

(int pid)

void

release_forks

(int pid)

void

philosopher

(int i)

}void

main()

死鎖 哲學家就餐問題

在 死鎖 這一篇文章中,我們學習了死鎖相關的理論知識,本篇文章來看看死鎖案例 哲學家就餐問題,這篇文章主要來討論就餐問題的死鎖和多種死鎖修復的方法。看上圖,有五位哲學家,面前都有乙個盤子,盤子左邊和右邊都有一根筷子,他們在吃麵之前需要先拿起左邊的筷子再拿起右邊的筷子,有了一雙筷子就可以吃麵了。上面流...

死鎖與哲學家就餐問題

死鎖 死鎖是指多個資源之間互相等待對方的資源,而在得到對方的資源之前又不釋放自己的資源,這樣,造成迴圈等待的一種現象,如果所有程序都在互相等待乙個不可能發生的事件,則程序就死鎖了。死鎖產生的必要條件 1.互斥條件 程序對資源進行排他性使用,即在一段時間內對某資源僅為乙個程序所占用 2.請求和保持條件...

哲學家就餐問題

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