C# 死锁的原理与排查方法详解
01
—
死鎖的原理
? ? ?線程死鎖是指由于兩個或者多個線程互相持有對方所需要的資源,并且互相等待對方釋放資源,導致這些線程都處于等待狀態,無法繼續執行。如果線程都不主動釋放所占有的資源,將產生死鎖。
如果死鎖發生在UI線程,則會導致界面停止響應。
死鎖的條件:
1.互斥條件:線程對于所分配到的資源具有排它性,即一個資源只能被一個線程占用,直到被該線程釋放
2.請求和保持條件:一個線程因請求被占用資源而發生阻塞時,對已獲得的資源保持不放。
3.不剝奪條件:任何一個資源在沒被該線程釋放之前,任何其他線程都無法對他剝奪占用
4.循環等待條件:當發生死鎖時,所等待的線程必定會形成一個環路(類似于死循環),造成永久阻塞
02
—
死鎖示例
03
—
如何避免死鎖
方法一. 破壞互斥條件
方法二. 破壞環路等待條件
方法三. 破壞不剝奪條件
方法四. 破壞請求和保持條件
采用方法四舉例:
04
—
排查方法
step1:在代碼調試中,點擊暫停按鈕,然后vs就會自動定位到
step2:打開并行堆棧:然后點擊指定方法名,進一步定位死鎖語句
05
—
排查工具
可以采用第三方檢測工具LockCop,檢測死鎖線程號,便于在非調試情況下查詢死鎖線程號,然后可以結合日志等信息排查死鎖原因。
技術群:?需要進技術群學習交流的請添加小編微信,切記備注:加群,對U上內容有什么疑問也可以直接和小編直接溝通交流!? ???
小編微信:mm1552923 ??
公眾號:dotNet編程大全? ? ??
總結
以上是生活随笔為你收集整理的C# 死锁的原理与排查方法详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF 实现展示反应盘、者试剂仓控件
- 下一篇: c# char unsigned_dll