死鎖 哲學家就餐問題

2021-09-29 14:56:51 字數 2560 閱讀 6013

在【死鎖】這一篇文章中,我們學習了死鎖相關的理論知識,本篇文章來看看死鎖案例——哲學家就餐問題,這篇文章主要來討論就餐問題的死鎖和多種死鎖修復的方法。

看上圖,有五位哲學家,面前都有乙個盤子,盤子左邊和右邊都有一根筷子,他們在吃麵之前需要先拿起左邊的筷子再拿起右邊的筷子,有了一雙筷子就可以吃麵了。

上面流程有死鎖和資源耗盡的風險

哲學家:每個哲學家重複做的事就是:思考,拿筷子吃麵

public

class

philosopher

implements

runnable

/** * 每個哲學家重複做的事就是:思考,拿筷子吃麵

*/@override

public

void

run(

)doaction

("放下左邊筷子...");

}}}catch

(interruptedexception e)

}private

void

doaction

(string action)

throws

interruptedexception

}

啟動主類:

public

class

diningphilosophers

for(

int i =

0; i < philosophers.length; i++)}

}

列印結果:可以看到,五個哲學家最後都拿起了左邊筷子,都在等右邊筷子,就發生了死鎖。

...

哲學家3號 拿起左邊筷子...<

哲學家2號 思考中...

哲學家1號 拿起右邊筷子,然後開始吃麵...

哲學家1號 放下右邊筷子...

哲學家1號 放下左邊筷子...

哲學家2號 拿起左邊筷子...<

哲學家5號 拿起右邊筷子,然後開始吃麵...

哲學家1號 思考中...

哲學家5號 放下右邊筷子...

哲學家5號 放下左邊筷子...

哲學家1號 拿起左邊筷子...<

哲學家5號 思考中...

哲學家4號 拿起右邊筷子,然後開始吃麵...

哲學家4號 放下右邊筷子...

哲學家4號 放下左邊筷子...

哲學家5號 拿起左邊筷子...<

哲學家4號 思考中...

哲學家4號 拿起左邊筷子...<

服務員檢查(避免策略):引入乙個服務員協調,就是說當哲學家要拿起筷子的時候,先詢問服務員能否拿起,服務員就會檢查拿起筷子是否會有死鎖的發生,不會的話就允許哲學家拿起筷子,相反如果可能會發生死鎖就不讓哲學家拿起筷子。

改變乙個哲學家拿叉子的順序(避免策略):因為要發生死鎖,一定是所有哲學家都拿起了左邊的筷子,發生了死鎖環路,但是假如有個哲學家不按照順時針拿的話,就是說先拿右邊筷子,這樣就永遠不會發生都在等右邊筷子的死鎖環路了。

餐票(避免策略):就是說每個人吃飯前都要先拿到餐票才能拿筷子吃麵,餐票總共只有4張,也就是說一定有個人能拿到一雙筷子吃麵,但是吃完餐票也要還回去。

領導調節(檢測與恢復策略):並不是不讓你發生死鎖,而是等你死鎖了,領導檢測到了死鎖發生(五個人都拿起了左邊的筷子),就會命令其中乙個人放下筷子,讓別人先吃。

public

class

diningphilosophers

for(

int i =

0; i < philosophers.length; i++

)else

newthread

(philosophers[i]

,"哲學家"

+(i +1)

+"號").

start()

;}}}

列印結果:程式會一直執行下去,不再發生死鎖。

哲學家1號 思考中...

哲學家3號 思考中...

哲學家4號 思考中...

哲學家2號 思考中...

哲學家5號 思考中...

哲學家4號 拿起左邊筷子...

哲學家2號 拿起左邊筷子...

哲學家4號 拿起右邊筷子,然後開始吃麵...

哲學家2號 拿起右邊筷子,然後開始吃麵...

哲學家5號 拿起左邊筷子...

哲學家4號 放下右邊筷子...

哲學家4號 放下左邊筷子...

哲學家5號 拿起右邊筷子,然後開始吃麵...

哲學家4號 思考中...

哲學家5號 放下右邊筷子...

哲學家2號 放下右邊筷子...

...

死鎖與哲學家就餐問題

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

哲學家就餐問題

本文是哲學家就餐問題在 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...