【问题标题】:Parallel For does NOT cause deadlock in static constructor?Parallel For 不会导致静态构造函数死锁?
【发布时间】:2013-04-02 21:21:54
【问题描述】:

我试图将线程添加到我拥有的静态类中,但遇到了一堆问题。我阅读了this thread 和它链接的博客文章,我想我明白发生了什么。但我不明白为什么 Parallel For 循环仍然像这个例子一样工作:

using System;
using System.Threading;
using System.Threading.Tasks; 

namespace ThreadingTest
{
    public static class TestClass
    {
        public static int AwesomeNum = 43; 

        static TestClass()
        {
            string[] x = { "deal", "witch", "panda"};

            //does not cause a deadlock? huh?
            Parallel.For(0, x.Length,  i =>
                {
                    Console.WriteLine(x[i]); 
                });

            //results in a deadlock
            //Parallel.Invoke(writesomething, writesomethingelse); 

            //results in deadlock
            Thread thread = new Thread(new ThreadStart(() =>
            {
                Console.WriteLine("there is a bear in my soup"); 
            }));

            thread.Start();
            thread.Join(); 
        }

        private static void writesomething()
        {
            Console.WriteLine("writing something"); 
        }

        private static void writesomethingelse()
        {
            Console.WriteLine("writing something else."); 
        }
    }
}


using System;

namespace ThreadingTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(TestClass.AwesomeNum.ToString()); 
        }
    }
}

【问题讨论】:

标签: c# .net multithreading


【解决方案1】:

以下导致死锁:

Parallel.For(0, x.Length,  i => {
   Console.WriteLine(i); 
});

有什么区别?

我上面写的 lambda 表达式被编译为 TestClass 中的一个方法。您在new Thread 示例中所写的也是如此。

您在并行表达式 i => Console.WriteLine(x[i]) 中编写的 lambda 被编译成不同的编译器生成的类,因为它捕获了 x。所以要执行它需要静态初始化闭包类,而不是TestClass

因此,Parallel 与任何其他线程机制无关。这只是需要生成闭包对象的 lambda 和不需要生成闭包对象的 lambda 之间的区别。

注意,我描述的是当前编译器的行为。这种行为可以在相关规范中找到,也可以是实现定义的。我没看过。

【讨论】:

  • 闭包类如何实现的细节在 C# 规范中被称为实现细节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-21
  • 1970-01-01
相关资源
最近更新 更多