小编emb*_*bee的帖子

CLR通过C#4th Ed. - 对等待任务死锁感到困惑

杰弗里里希特在他的书"CLR via C#"中指出了我不理解的可能死锁的例子(第702页,边框段落).

该示例是一个运行Task并为此Task调用Wait()的线程.如果未启动任务,则Wait()调用可能不会阻塞,而是运行未启动的任务.如果在Wait()调用之前输入了锁,并且Task也尝试输入此锁,则可能导致死锁.

但是锁是在同一个线程中输入的,如果这最终导致死锁情况?

以下代码生成预期输出.

class Program
{
    static object lockObj = new object();

    static void Main(string[] args)
    {
        Task.Run(() =>
        {
            Console.WriteLine("Program starts running on thread {0}",
                Thread.CurrentThread.ManagedThreadId);
            var taskToRun = new Task(() =>
            {
                lock (lockObj)
                {
                    for (int i = 0; i < 10; i++)
                        Console.WriteLine("{0} from Thread {1}", 
                            i, Thread.CurrentThread.ManagedThreadId);
                }
            });

            taskToRun.Start();
            lock (lockObj)
            {
                taskToRun.Wait();
            }

        }).Wait() ;
    }
}

/* Console output
Program starts running on thread 3
0 from Thread 3 …
Run Code Online (Sandbox Code Playgroud)

.net c# clr deadlock task-parallel-library

8
推荐指数
1
解决办法
857
查看次数

标签 统计

.net ×1

c# ×1

clr ×1

deadlock ×1

task-parallel-library ×1