哲學家問題的解決

2021-10-08 23:35:12 字數 2231 閱讀 7977

筷子

public

class

chopsticks

哲學家

public

class

philosopher

private string name;

// 左手筷子

private chopsticks left;

// 右手筷子

private chopsticks right;

public

void

eating()

catch

(interruptedexception e)

synchronized

(right)

catch

(interruptedexception e)

system.out.

println

(this

.name+

" is eating ...");

}}}}

主函式

public

class

main).

start()

;new

thread((

)->).

start()

;new

thread((

)->).

start()

;new

thread((

)->).

start()

;new

thread((

)->).

start();}}

使用時先分配左手,再分配右手,產生了死鎖問題。

先獲取程序號

根據程序號檢視死鎖裝態

死鎖的詳細資訊

上面,哲學家p1先獲取左手的筷子c1,哲學家p5先獲取左手的筷子c5;之後哲學家p1再獲取右手的筷子c5,但是此時c5被哲學家p5佔據,且不可被搶奪,p1因此在等待。其他哲學家類似,因此造成了死鎖。

上例中,分配時先按左手分配,再按右手分配。我們可以改變分配方式,按照順序分配資源。在上面的例子中,只有p5的資源沒有按照順序分配,我們可以做如下修改。

執行結果如下圖所示,p5最後執行。使用按序分配資源的方式可以很簡單地解決死鎖問題,但是由於p5總是最後獲取資源,所以會產生飢餓問題。

上例中,通過按序分配避免了死鎖的迴圈等待條件的發生,在本例中,可以避免不可剝奪的條件,避免死鎖的發生。當哲學家獲取到左手的資源時,如果他未能及時申請到右手的資源,則將所有占有的資源釋放。

修改筷子的**,繼承reentrantlock,以便於可以加鎖及釋放。

public

class

chopsticks

extends

reentrantlock

修改eating方法的**,其他的不變。如果哲學家未能獲取到左手,則繼續等待。如果哲學家獲取到了左手的筷子,但未獲取到右手的筷子,則釋放左手的筷子。

public

void

eating()

catch

(interruptedexception e)

if(left.

trylock()

)catch

(interruptedexception e)

if(right.

trylock()

)finally}}

finally}}

}

執行結果如下。p5並不是總位於最後,因此不會有飢餓問題。

哲學家問題

問題描述 有五個哲學家繞著圓桌坐,每個哲學家面前有一盤面,兩人之間有一支筷子,這樣每個哲學家左右各有一支筷子。哲學家有2個狀態,思考或者拿起筷子吃飯。如果哲學家拿到乙隻筷子,不能吃飯,直到拿到2只才能吃飯,並且一次只能拿起身邊的一支筷子。一旦拿起便不會放下筷子直到把飯吃完,此時才把這雙筷子放回原處。...

哲學家就餐問題

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

哲學家進餐問題

哲學家進餐問題 一 問題 5個哲學家圍坐在乙個圓桌上,每兩個哲學家之間都有乙隻筷子,哲學家平時進行思考,只有當他們飢餓時,才拿起筷子吃飯。規定每個哲學家只能先取其左邊筷子,然後取其右邊筷子,然後才可以吃飯。二 分析 每乙隻筷子都是乙個臨界資源,設定5個互斥訊號量。semaphore stcik 5 ...