【问题标题】:Task deadlock doesn't occur不会发生任务死锁
【发布时间】:2016-11-30 21:08:50
【问题描述】:

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

“锁定 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();
}

【问题讨论】:

  • 在你获得lockB之后,尝试在主线程中添加一个睡眠。
  • 10/10 结果是死锁。为什么会这样?我认为它应该是一些多样性。

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


【解决方案1】:

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

【讨论】:

  • 感谢您的回答。而且输出的顺序也不能保证?我只得到 B-A,A-B,从来没有 A-B,B-A。也许我需要尝试更多才能获得其他结果......
  • @Stalli 虽然技术上创建的任务有可能首先运行到完成,但在任何实际意义上,这是不可能的,所以你不太可能看到订购。
  • 是不是说主线程通常是从任务运行的那一刻开始的?
  • @Stalli 通常。它已经在运行,虽然线程调度程序可能在调度一个新线程运行后立即停止它,但它并不是特别可能最终被停止确切的时刻。
  • 非常感谢您,Servy。
猜你喜欢
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2020-07-31
  • 2021-09-04
  • 1970-01-01
相关资源
最近更新 更多