哲學家進餐 避免死鎖

2021-10-05 22:14:40 字數 2441 閱讀 1295

這題的考察點是避免死鎖(乙個叉子就是一把鎖),假設不加限制讓執行緒自由的獲取鎖,那麼大家都先拿位於自己左側的叉子再拿右側的叉子,由於是個圓桌,相鄰的倆人前乙個人左側就是下乙個人的右側(逆時針方向),如果大家都拿了左側的叉子那完犢子,都餓死吧。

要解決死鎖首先先明確下死鎖造成的原因

有興趣闊以看看這篇生活中的死鎖

1.互斥條件:資源不能被共享。(互相喂?這也太哲學了吧)

2.請求與保持條件:已經得到資源的程序可以再次申請新的資源。(其實我覺得單個叉子吃也不是不可以,哲學家就是麻煩)

3.非剝奪條件:已經分配的資源不能從相應的程序中被強制地剝奪。(會打架的吧)

4.迴圈等待條件:系統中若干程序等待的資源組成環路(圓桌結構)

看來能打破的也只有4個條件或者2個條件了。

1.1第4個條件會形成死鎖得成環,那我們不讓五個人同時吃不就行了

1.2 不讓它成環還可以」錯峰「獲取叉子嘛,相鄰倆人乙個先左後右,乙個先右後左。

2.第2個條件倒不是說乙個叉子吃,手持乙個叉子卻獲取不到另乙個叉子一段時間就放下手中的叉子(大家都謙讓點嘛)。

1.1使用訊號量semaphore,它能實現至多多少個執行緒能夠參與對資源的競爭。

class

diningphilosophers

;private semaphore eat =

newsemaphore(4

);//1~4任選

public

diningphilosophers()

// call the run() method of any runnable to execute its code

public

void

wantstoeat

(int philosopher,

runnable pickleftfork,

runnable pickrightfork,

runnable eat,

runnable putleftfork,

runnable putrightfork)

throws interruptedexception

finally

}}

1.2.

錯峰,奇數哲學家先左後右,偶數相反即可

class

diningphilosophers

reentrantlock[

] forks =

;//semaphore toeat = new semaphore(4);

// call the run() method of any runnable to execute its code

public

void

wantstoeat

(int philosopher,

runnable pickleftfork,

runnable pickrightfork,

runnable eat,

runnable putleftfork,

runnable putrightfork)

throws interruptedexception

else

tryfinally

}}

這個有點麻煩的地方,就是僅得到乙個鎖時,得釋放它啊。然後下次仍然嘗試同樣的動作,跳出迴圈的唯一的方式就是成功獲取兩個叉子。

class

diningphilosophers

reentrantlock[

] forks =

;// call the run() method of any runnable to execute its code

public

void

wantstoeat

(int philosopher,

runnable pickleftfork,

runnable pickrightfork,

runnable eat,

runnable putleftfork,

runnable putrightfork)

throws interruptedexception

else

finally

else

if(left)}}

}while

(true);

tryfinally

}}

哲學家進餐問題

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

哲學家進餐問題

一張圓桌上坐著5名哲學家,每兩個哲學家之間的桌上擺一根筷子,桌子的中間是一碗公尺飯,如圖所示。哲學家們傾注畢生精力用於思考和進餐,哲學家在思考時,並不影響他人。只有當哲學家飢餓的時候,才試圖拿起左 右兩根筷子 一根一根地拿起 如果筷子已在他人手上,則需等待。飢餓的哲學家只有同時拿到了兩根筷子才可以開...

哲學家進餐問題

哲學家進餐問題 五個哲學家共用一張圓桌,分別坐在周圍的五張椅子上,在桌子上有五隻碗和五隻筷子,他們的生活方式是交替地進行思考和進餐。平時,乙個哲學家進行思考,飢餓時便試圖取用其左右最靠近他的筷子,只有在他拿到兩隻筷子時才能進餐。進餐畢,放下筷子繼續思考 分析 放在桌子上的筷子是臨界資源,在一段時間內...