任务死锁不会发生

时间:2016-11-30 21:08:50

标签: c# .net parallel-processing task-parallel-library task

我在书中找到了这个例子。并且它写了这段代码导致死锁。但是我不明白并且不明白它为什么会这样? 我总是得到

  

“锁定B和A”

     

“锁定A和B”

static void Main()
{
    object lockA = new object();
    object lockB = new object();
    var up = Task.Run(() =>
    {
        lock (lockA)
        {
            Thread.Sleep(1000);
            lock (lockB)
            {
                Console.WriteLine(“Locked A and B”);
            }
        }
    });

    lock (lockB)
    {
        lock (lockA)
        {
            Console.WriteLine(“Locked B and A”);
        }
    }

    up.Wait();
    Console.ReadLine();
}

1 个答案:

答案 0 :(得分:2)

代码无法保证死锁。关于它是否会陷入僵局存在竞争条件。如果新启动的任务设法在主线程继续获取同一个锁之前获取第一个锁,那么代码死锁,如果(毫无疑问发生在你身上)第一个线程设法在工作线程之前获得两个锁做了什么,然后没有僵局。