2012-08-05 131 views
2

是否有任何常見的慣例或規則可以避免程序中的死鎖? CLR還是來自語言/框架的任何工具的支持來處理這種情況?如何在.NET中避免死鎖

+6

「按順序鎖定事物」是否包含在內? – 2012-08-05 10:39:10

+1

很難限制回答「只是避免穿線」。 – 2012-08-05 10:41:35

+0

對不起,我只是想知道我是否可以遵循一些規則來避免這些問題(例如,不要鎖定這個問題)。 – user854301 2012-08-05 11:08:06

回答

1

我想你去走一走問題的最佳方法是使用控制的正常過程。使用Mutexes或Semaphores保護對資源的訪問。

這可以幫助你

http://msdn.microsoft.com/en-us/library/hw29w7t1(v=vs.71).aspx

+3

我看不出以任何方式改變了問題;這是相同的問題,但是使用操作系統管理的鎖定原語。您可以像使用互斥/信號量一樣輕鬆地實現死鎖。 – 2012-08-05 10:52:19

+0

是的你是對的,實際上互斥和信號量是造成僵局的原因。我想避免它的唯一方法是非常好地規劃代碼訪問資源的方式。 – j0N45 2012-08-05 11:15:34

12

注意一點,這是.NET的具體:

避免死鎖最大的方式是鎖在一個一致的順序;這意味着你會定期阻止而不是陷入僵局,但需要對你正在鎖定什麼以及什麼時候進行多少思考和規劃。無論如何,這個想法和計劃是必要的。

實現此目的的一個簡單方法是:嘗試一次只需要一個鎖對象;因此,不是鎖定A B,而是單獨鎖定A ,然後 B.這也需要思考和計劃,但通常是可以實現的。

從更一般的角度來看,避免過度鎖定可能是一個巨大的理智保護。對於可能競爭的鎖對象,請認真考慮只爲這兩個概念使用單個鎖。在很多情況下,這不會對競爭時間產生巨大影響,但會使代碼更加簡單和可靠。

實際上,我對語言的一個抱怨是「帶鎖但帶超時」是這麼多的代碼密集度比「帶鎖」要多得多。確保你總是有超時也可以確保一個總鎖變得可恢復。但是這應該主要用於識別以錯誤的順序鎖定的區域,以便您可以修復它們。

+0

我很感謝你的回答。 – user854301 2012-08-05 19:07:17