2010-06-23 143 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