2010-06-23 138 views
1

嗨,大家好我正在提高我對多線程C#的知識,並想知道如何解決這個經典的死鎖問題。死鎖c#解決方案

public class SomeClass 
{ 
    private object _lock1 = new object(); 
    private object _lock2 = new object(); 


    public void Method1() 
    { 
     lock (_lock1) 
     { 
      Thread.Sleep(10000); 
      lock (_lock2) 
      { 
       Thread.Sleep(10000); 
      } 
     } 
    } 

    public void Method2() 
    { 
     lock (_lock2) 
     { 
      Thread.Sleep(10000); 
      lock (_lock1) 
      { 
       Thread.Sleep(10000); 
      } 
     } 
    } 
} 

如果兩個線程同時運行,則存在死鎖的風險。

感謝

+5

你解決它永遠不會寫任何這樣的事情。如果你出於某種愚蠢的原因絕對必須這樣做,並且它不能被重新設計,那麼線程應該嘗試外部鎖,如果他們不能立即採取措施,那就去做其他事情,然後再回來嘗試鎖。 – 2010-06-23 06:53:37

+0

也許這篇文章*沒有更多的掛起:先進的技術,以避免和檢測.NET應用程序中的死鎖* [MSDN](http://download.microsoft.com/download/3/a/7/3a7fa450-1f33-41f7- 9e6d-3aa95b5a6aea/MSDNMagazineApril2006en-us.chm)可能會有所幫助。 – Oliver 2015-09-14 06:52:43

回答

2
  • 把你鎖在一個一致的順序
  • 保持你的鎖粒狀儘可能
  • ,避免鎖儘可能使用不可變的數據結構
  • 使用Monitor.TryEnter而不是鎖(它不超時)
2

這不是C#問題,它是更一般的。 你的例子顯然不正確。 儘量避免鎖定重疊是最終陷入僵局的常見模式。 有一本好書關於同步: http://greenteapress.com/semaphores/

+0

感謝您的回覆,我會看看那本書。 – 2010-06-23 07:28:37

0

,必須始終採取鎖以相同的順序:先鎖定一個,然後鎖定兩年等。 你不需要總是取所有的鎖:例如,你可以讓method1()取lock1和lock2,而method2()只取lock2,它不會造成死鎖。

+0

您能否在您的答案中添加一些示例代碼,以便在提出問題的上下文中說出您的答案。具體示例示例非常有用。 – 2012-11-23 15:20:55