Linux 淺析線程死鎖

所謂的線程死鎖就是指多個線程因爲競爭資源而造成的一種僵局,一個線程不停的申請鎖,釋放鎖,從而不給另外的線程,獲得資源的機會,這就是死鎖問題。若沒有外力的作用,那麼這些線程偶會卡到這裏無法推進。

產生死鎖的必要條件:

1:互斥條件:進程要求對分配的資源進行排他性控制,即在一段時間內某資源僅爲一個進程所佔有,此時若有其他進程請求該資源,則請求進程只能等待
2:不剝奪條件:進程所獲得資源在未使用完畢之前,不能被其他進程強行奪走,即只能由獲得該資源的進程自己來釋放
3:請求和保持條件:進程已經保持了至少一個資源,但又提出新的資源請求,而該資源已經被其他進程佔有,此時請求進程被阻塞,但對自己已經獲得的資源保持不釋放
4:循環等待條件:存在一種進程資源循環等待鏈,鏈中每一個進程已獲得的資源同時被鏈中選圖個進程所請求,即存在一個處於等待狀態的進程集合

如何避免死鎖

1:加鎖順序(線程按照一定的順序加鎖)
按照順序加鎖是一種有效的預防死鎖的方法,但是這種方法需要你事先知道所有可能用到的鎖,並且對這些鎖做適當的安排(在實際情況中,有些情況是無法預知的)

2:加鎖時限(線程嘗試獲取鎖的時候加上一定的時限,超過時限則放棄對該鎖的請求,並釋放自己佔有的鎖)
若一個線程沒有在給定時限內成功獲得所有需要的鎖,則會進行回退並釋放所有已經獲得的鎖,然後等待一段時間再重試,這段隨機等待時間讓其他線程有機會嘗試獲取相同的這些鎖,並且讓該應用在沒有獲得鎖的時候可以繼續運行
(需要注意:由於存在鎖的超時,不一定就是出現了死鎖,有可能是獲得鎖的線程,需要很長一段時間來完成它的任務)

3:死鎖檢測
死鎖檢測是一個更好的預防死鎖的方法,它主要針對那些不可能實現按序加鎖並且加鎖超時也不適合的情況
每當一個線程獲得了鎖,會在線程和鎖相關的數據結構中將它記下來,另外,有其他線程請求鎖,也需要記錄在這數據結構中,當一個線程請求鎖失敗的時候,這個線程可以遍歷鎖的關係看看是否存在死鎖發生

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章