gpt4 book ai didi

c# - Parallel For 不会导致静态构造函数中的死锁?

转载 作者:行者123 更新时间:2023-11-30 20:03:06 25 4
gpt4 key购买 nike

我试图将线程添加到我拥有的静态类中,但遇到了很多问题。我读了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());
}
}
}

最佳答案

以下导致死锁:

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

有什么区别?

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

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

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

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

关于c# - Parallel For 不会导致静态构造函数中的死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15774640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com