是否有任何常見的慣例或規則可以避免程序中的死鎖? CLR還是來自語言/框架的任何工具的支持來處理這種情況?如何在.NET中避免死鎖
回答
MSDN實際上有關於這一主題幾篇好文章,其中存在一種:
Avoiding and Detecting Deadlocks in .NET Apps with C# and C++
感謝您的鏈接! – user854301 2012-08-05 19:05:04
我想你去走一走問題的最佳方法是使用控制的正常過程。使用Mutexes或Semaphores保護對資源的訪問。
這可以幫助你
http://msdn.microsoft.com/en-us/library/hw29w7t1(v=vs.71).aspx
我看不出以任何方式改變了問題;這是相同的問題,但是使用操作系統管理的鎖定原語。您可以像使用互斥/信號量一樣輕鬆地實現死鎖。 – 2012-08-05 10:52:19
是的你是對的,實際上互斥和信號量是造成僵局的原因。我想避免它的唯一方法是非常好地規劃代碼訪問資源的方式。 – j0N45 2012-08-05 11:15:34
注意一點,這是.NET的具體:
避免死鎖最大的方式是鎖在一個一致的順序;這意味着你會定期阻止而不是陷入僵局,但需要對你正在鎖定什麼以及什麼時候進行多少思考和規劃。無論如何,這個想法和計劃是必要的。
實現此目的的一個簡單方法是:嘗試一次只需要一個鎖對象;因此,不是鎖定A 和 B,而是單獨鎖定A ,然後 B.這也需要思考和計劃,但通常是可以實現的。
從更一般的角度來看,避免過度鎖定可能是一個巨大的理智保護。對於可能競爭的鎖對象,請認真考慮只爲這兩個概念使用單個鎖。在很多情況下,這不會對競爭時間產生巨大影響,但會使代碼更加簡單和可靠。
實際上,我對語言的一個抱怨是「帶鎖但帶超時」是這麼多的代碼密集度比「帶鎖」要多得多。確保你總是有超時也可以確保一個總鎖變得可恢復。但是這應該主要用於識別以錯誤的順序鎖定的區域,以便您可以修復它們。
我很感謝你的回答。 – user854301 2012-08-05 19:07:17
- 1. 如何避免mysql死鎖?
- 2. 避免螺旋鎖死鎖
- 3. 交易 - 如何避免死鎖?
- 4. 如何避免死鎖條件
- 5. C# - 如何避免使用TcpClient死鎖?
- 6. 如何避免數據庫死鎖
- 7. 如何避免這些死鎖?
- 8. Linux內核如何避免死鎖?
- 9. 如何在postgresql中使用諮詢鎖時避免死鎖
- 10. 搶先避免死鎖
- 11. 避免死鎖示例
- 12. 避免死鎖 - 過程
- 13. 避免死鎖MySQL/UniDAC/Delphi
- 14. 如何確保鎖定順序以避免死鎖?
- 15. 避免死鎖和防止死鎖有什麼區別?
- 16. 兩個條件變量,避免死鎖
- 17. 刪除關係時避免死鎖
- 18. JDBC和死鎖避免問題(基本)
- 19. 同步方法,以避免死鎖
- 20. 通過信號量避免死鎖?
- 21. 正確避免R/W文件死鎖
- 22. 避免併發刪除造成死鎖
- 23. Rails 4 Racing/Concurrency。避免死鎖
- 24. 如何避免這個golang程序中的死鎖?
- 25. 如何避免死鎖中的非唯一聚簇索引
- 26. 如何從連接表中選擇時避免死鎖?
- 27. 獲取對兩個互斥鎖的鎖定並避免死鎖
- 28. 如何避免在MongoDB中鎖定
- 29. 如何避免死鎖情況插入選擇更新重複?
- 30. 如何避免嵌套同步和導致的死鎖
「按順序鎖定事物」是否包含在內? – 2012-08-05 10:39:10
很難限制回答「只是避免穿線」。 – 2012-08-05 10:41:35
對不起,我只是想知道我是否可以遵循一些規則來避免這些問題(例如,不要鎖定這個問題)。 – user854301 2012-08-05 11:08:06