【问题标题】:Deadlocks c# Solution死锁c#解决方案
【发布时间】:2010-06-23 06:48:07
【问题描述】:

大家好,我正在提高对多线程 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);
            }
        }
    }
}

如果两个线程同时运行,则存在死锁的风险。

谢谢

【问题讨论】:

  • 你可以通过从不写任何这样的东西来解决它。如果您有某些情况由于某些愚蠢的原因而绝对必须这样做并且无法重新设计,那么线程应该尝试外部锁,如果它们不能立即获取它,请去做其他事情并返回并再次尝试锁。
  • 也许MSDN 上的文章No More Hangs: Advanced Techniques To Avoid and Detect Deadlocks In .NET Apps 可能会有所帮助。

标签: c# multithreading locking


【解决方案1】:
  • 锁具顺序一致
  • 让您的锁尽可能细化
  • 尽可能使用不可变数据结构避免锁定
  • 使用 Monitor.TryEnter 代替 lock(不会超时)

【讨论】:

    【解决方案2】:

    这不是 C# 问题,它更普遍。 你的例子显然是不正确的。 如果您最终陷入死锁,请尽量避免锁重叠是常见的模式。 有一本关于同步的好书: http://greenteapress.com/semaphores/

    【讨论】:

    • 感谢您的回复,我去看看那本书。
    【解决方案3】:

    您必须始终按照相同的顺序进行锁定:先锁定一个,然后锁定第二个,依此类推。 不需要总是取所有锁:例如可以让method1()取lock1和lock2,method2()只取lock2,不会造成死锁。

    【讨论】:

    • 您能否在答案中添加一些示例代码,以便在提出问题的上下文中表达您的回答。具体示例非常有用。
    猜你喜欢
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    相关资源
    最近更新 更多