2012-01-18 274 views
-1

我在C#中有一個多線程程序。在實踐中防止僵局的最佳方法是什麼?C#線程死鎖

是時間嗎?

此外,什麼是可用於幫助檢測和防止死鎖的最佳工具?

非常感謝。

+2

只有一個很好的工具,在你的耳朵之間。檢測它並不難。 – 2012-01-18 05:18:40

+2

避免死鎖的最好方法是不要使用鎖!如果沒有,請謹慎使用!有一些適度的幫助規則,比如總是以相同的順序獲取。 – 2012-01-18 05:22:39

+0

[優先反演](http://en.wikipedia.org/wiki/Priority_inversion)也應該在設計中考慮。 – 2012-01-18 09:29:33

回答

2

死鎖通常發生在有幾個可能性:

  1. 您正在使用多個鎖,而不是鎖定/在解鎖他們正確的順序。因此,您可能會創建一個線程持有鎖A並且需要鎖B的情況,而另一個線程需要鎖A並持有鎖B.這兩種情況都不能繼續。這是因爲每個線程都以不同的順序鎖定。

  2. 使用可重入鎖並鎖定的次數超過了解鎖次數時。請參閱此相關的問題:當使用Monitor.Wait/Monitor.Pulse作爲信令機制,但這必須調用Wait線程不設法到達由另一個線程稱爲Pulse和信號丟失時的調用why does the following code result in deadlock

  3. 。您可以使用AutoResetEvent作爲持續信號。

  4. 您有一個工作線程輪詢一個標誌,以知道何時停止。主線程設置標誌並嘗試加入工作線程,但忘記了標誌volatile