多線程程序發生死鎖,某些重要線程卡住,不正常工作。排查起來非常麻煩。以下內容記錄排查方法
1.確定死鎖的位置,一般死鎖會lock到某一行具體的代碼,比如我就死鎖在類似如下代碼中
public void SendSerialportMsg() { lock(this) //死鎖 { //.. } }
具體定位死鎖位置的方法:運行模式下,visual studio--調試--窗口--線程,底下欄目會多出一欄線程視圖。
點擊程序暫停運行按鈕,在打開線程視圖,就能看到所有的線程列表。找到你認爲發生死鎖的那條線程,右鍵切換到線程,程序就能自動跳轉到死鎖那一行代碼,如下類似
2、已經找到死鎖位置了,首先如果比較簡單,先人工review一下,看看能不能找到死鎖問題
3、如果不能簡單解決。那可以嘗試,給可能產生死鎖的線程加上線程名,便於辨認。然後,修改死鎖位置代碼如下
Thread lastThread=null; public void SendSerialportMsg() { lastThread = Thread.CurrentThread; lock (this) //死鎖位置 { lastThread = Thread.CurrentThread; //.. } }
4、再重現一次死鎖。定位到死鎖行,然後展開lastThread,看該線程運行在那裏卡住,以致於後續線程不能響應。然後排查lastThread的阻塞問題。Done!!!