定位死鎖位置(跨平臺)

死鎖產生

死鎖是如此產生的,以下內容引用一個 Linux 上分析死鎖的簡單方法

死鎖 (deallocks): 是指兩個或兩個以上的進程(線程)在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系?統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程(線程)稱爲死鎖進程(線程)。 由於資源佔用是互斥的,當某個進程提出申請資源後,使得有關進程(線程)在無外力協助下,永遠分配不到必需的資源而無法繼續運行,這就產生了一種特殊現象死鎖。
一種交叉持鎖死鎖的情形,此時執行程序中兩個或多個線程發生永久堵塞(等待),每個線程都在等待被其它線程佔用並堵塞了的資源。例如,如果線程 1 鎖住了記錄 A 並等待記錄 B,而線程 2 鎖住了記錄 B 並等待記錄 A,這樣兩個線程就發生了死鎖現象。在計算機系統中 , 如果系統的資源分配策略不當,更常見的可能是程序員寫的程序有錯誤等,則會導致進程因競爭資源不當而產生死鎖的現象。

產生死鎖的四個必要條件
(1) 互斥條件:一個資源每次只能被一個進程(線程)使用。
(2) 請求與保持條件:一個進程(線程)因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件 : 此進程(線程)已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 循環等待條件 : 多個進程(線程)之間形成一種頭尾相接的循環等待資源關係。

如何定位

上面的博客介紹瞭如何在Linux平臺上如何定位死鎖。我這裏提供了另一種思路,可以在任何平臺上使用。我通過這樣的方式解決了項目中存在的各種死鎖問題,寫一個宏只在調試階段才使用。

  • 簡單來說死鎖的產生就是多個線程需要相互拿已經被其他線程持有的鎖

  • 所以思路就是在每次獲取鎖之前和釋放鎖之後的位置做一下記錄,記錄獲取/釋放此鎖的線程、文件名和行號。獲取以後存入一個隊列中,釋放以後從隊列中移除。

  • 用一個獨立的線程隔一段時間掃描一遍隊列,如果產生死鎖,那麼隊列裏面剩下的位置就是產生死鎖的位置。

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