死鎖解決方法

2021-08-20 06:09:32 字數 1448 閱讀 5718

死鎖是程序併發執行過程中可能出現的現象,哲學家就餐問題是描述死鎖的經典例子。為了防止死鎖,可以採用資源預分配法或者資源按序分配法。資源預分配法是指程序在執行前一次性地向系統申請它所需要的全部資源,如果系統當前不能夠滿足程序的全部資源請求,則不分配資源, 此程序暫不投入執行,如果系統當前能夠滿足程序的全部資源請求, 則一次性地將所申請的資源全部分配給申請程序。資源按序分配法是指事先將所有資源類全排序, 即賦予每乙個資源類乙個唯一的整數,規定程序必需按照資源編號由小到大的次序申請資源。

設計內容:模擬有五個哲學家的哲學家進餐問題。

問題描述:哲學家的生活就是思考和吃飯,即思考,餓了就餐,再思考,迴圈往復。要求是:每乙個哲學家只有在拿到位於他左右的筷子後,才能夠就餐;哲學家只能先拿左邊的筷子,再去拿右邊的筷子,而不能同時去抓他兩邊的筷子,也不能從其他哲學家手中搶奪筷子;哲學家每次就餐後必須放下他手中的兩把筷子後恢復思考,不能強抓住餐具不放。 

以下給出了三種解決死鎖問題的方法,請仔細閱讀,選擇一種實現。

原理a:至多只允許四個哲學家同時進餐,以保證至少有乙個哲學家能夠進餐,最終總會釋放出他所使用過的兩支筷子,從而可使更多的哲學家進餐。將room作為訊號量,只允許4個哲學家同時進入餐廳就餐,這樣就能保證至少有乙個哲學家可以就餐,而申請進入餐廳的哲學家進入room的等待佇列。根據fifo的原則,總會進入就餐。因此不會出現餓死和死鎖的現象。

偽碼semaphorechopstick[5]=;

semaphoreroom=4;

voidphilosopher(int i)

}原理b:僅當哲學家的左右筷子都可用時,才允許他拿起筷子進餐。

方法1:利用and型訊號量機制實現:在乙個原語中,將一段**同時需要的多個臨界資源,要麼全部分配給它,要麼乙個都不分配,因此不會出現死鎖的情形。當某些資源不夠時阻塞呼叫程序;由於等待佇列的存在,使得對資源的請求滿足fifo的要求,因此不會出現飢餓的情形。

偽碼:semaphorechopstick[5]=;

voidphilosopher(int i)

}方法2:利用訊號的保護機制實現,通過訊號量mutex對eat()之前的取左側和右側筷子的操作進行保護,使之成為乙個原子操作這樣可以防止死鎖的出現。

偽碼:semaphore=1;

semaphorechopstick[5]=;

voidphilosopher(int i)

}原理c:規定奇數號的哲學家先拿起他左邊的筷子,然後再去拿他右邊的筷子;而偶數號的哲學家則相反。按此規定,將是1,2號哲學家競爭1號筷子,3,4號哲學家競爭3號筷子。即五個哲學家都競爭奇數號筷子,獲得後,再去競爭偶數號筷子,最後總會有乙個哲學家能獲得兩支筷子而進餐。而申請不到的哲學家進入阻塞等待佇列,跟fifo原則,則先申請的哲學家會較先可以吃飯,因此不會出現餓死的哲學家。

偽碼:semaphorechopstick[5]=;

voidphilosopher(int i)

else

}

死鎖及解決方法

死鎖的概念 quad 死鎖 指的是 quad 多個執行緒各自占有一些共享資源,並且互相等待其他執行緒占有的資源才能進行,而導致兩個或者多個執行緒都在等待對方釋放資源,都停止執行的情形。quad 因此,某乙個同步塊需要同時擁有 兩個以上物件的鎖 時,就可能會發生 死鎖 的問題。下面案例中,化妝執行緒 ...

死鎖現象及解決方法

死鎖現象 過多的同步可能造成相互不釋放資源 先定義兩個類,乙個口紅,乙個鏡子 class lipstick class mirror 化妝類 g0在鎖lipstick後又想鎖住mirror,g1在鎖住mirror後又想鎖住lipstick,當兩個同時都想擁有對方的鎖的時候,就會出現死鎖的現象。pub...

SqlServer表死鎖的解決方法

前些天寫乙個儲存過程,儲存過程中使用了事務,後來我把一些 注釋掉來進行除錯找錯,突然發現一張表被鎖住了,原來是建立事務的 忘記注釋掉。本文表鎖住了的解決方法。其實不光是上面描述的情況會鎖住表,還有很多種場景會使表放生死鎖,解鎖其實很簡單,下面用乙個示例來講解 1 首先建立乙個測試用的表 create...