C# 任务死锁不存在';不会发生

C# 任务死锁不存在';不会发生,c#,.net,parallel-processing,task-parallel-library,task,C#,.net,Parallel Processing,Task Parallel Library,Task,我在书中找到了这个例子。这段代码会导致死锁。但我不明白为什么会这样? 我总是很紧张 “锁定的B和A” “锁定A和B” 代码不能保证死锁。它是否会死锁有一个竞争条件。如果新启动的任务在主线程继续获取同一个锁之前成功地获取了第一个锁,那么代码就会死锁,如果(毫无疑问,您会遇到这种情况)第一个线程在工作线程执行任何操作之前成功地获取了两个锁,那么就不会出现死锁。代码不一定会死锁。它是否会死锁有一个竞争条件。如果新启动的任务在主线程继续抓取同一个锁之前成功抓取了第一个锁,那么代码就会死锁,如果(毫无疑问

我在书中找到了这个例子。这段代码会导致死锁。但我不明白为什么会这样? 我总是很紧张

“锁定的B和A”

“锁定A和B”


代码不能保证死锁。它是否会死锁有一个竞争条件。如果新启动的任务在主线程继续获取同一个锁之前成功地获取了第一个锁,那么代码就会死锁,如果(毫无疑问,您会遇到这种情况)第一个线程在工作线程执行任何操作之前成功地获取了两个锁,那么就不会出现死锁。

代码不一定会死锁。它是否会死锁有一个竞争条件。如果新启动的任务在主线程继续抓取同一个锁之前成功抓取了第一个锁,那么代码就会死锁,如果(毫无疑问,您会遇到这种情况)第一个线程在工作线程执行任何操作之前成功获取了两个锁,然后没有死锁。

在获得
lockB
后,也可以尝试在主线程中添加睡眠。10/10结果是死锁。为什么会这样?我认为应该有一些多样性。在获得
lockB
后,也可以尝试在主线程中添加睡眠。10/10结果是死锁。为什么会这样?我觉得应该是多样性的。谢谢你的回答。输出的顺序也不能保证吗?我只得到了B-A,A-B,而从来没有得到过A-B,B-A。也许我需要尝试更多来获得其他结果…@Stalli,虽然从技术上讲,创建的任务可能首先运行到完成,但从任何实际意义上讲,这是不可能的,因此,您不太可能看到这种排序。这是否意味着主线程通常从任务运行的那一刻起就先运行?Stalli通常这样说。它已经在运行,虽然线程调度程序可以在调度一个新线程运行后立即停止它,但不太可能在该时刻停止它。非常感谢您,Servy。谢谢您的回答。输出的顺序也不能保证吗?我只得到了B-A,A-B,而从来没有得到过A-B,B-A。也许我需要尝试更多来获得其他结果…@Stalli,虽然从技术上讲,创建的任务可能首先运行到完成,但从任何实际意义上讲,这是不可能的,因此,您不太可能看到这种排序。这是否意味着主线程通常从任务运行的那一刻起就先运行?Stalli通常这样说。它已经在运行了,虽然线程调度程序可以在调度一个新线程运行后立即停止它,但也不太可能在该时刻停止它。非常感谢,Servy。
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();
}