gpt4 book ai didi

c# - Plinq 语句在静态构造函数中陷入僵局

转载 作者:太空狗 更新时间:2023-10-29 18:19:13 24 4
gpt4 key购买 nike

我遇到过静态构造函数中的以下 plinq 语句陷入僵局的情况:

static void Main(string[] args)
{
new Blah();
}

class Blah
{
static Blah()
{
Enumerable.Range(1, 10000)
.AsParallel()
.Select(n => n * 3)
.ToList();
}
}

只有当构造函数是静态的时才会发生。有人可以向我解释一下吗。

是 TPL 错误吗?编译器?我?

最佳答案

从静态构造函数调用线程代码通常是危险的。为了确保静态构造函数只执行一次,CLR 在锁下执行静态构造函数。如果运行静态构造函数的线程在辅助线程上等待,则存在辅助线程出于某种原因也需要 CLR 内部锁的风险,程序将死锁。

下面是演示问题的更简单的代码示例:

using System.Threading;
class Blah
{
static void Main() { /* Won’t run because the static constructor deadlocks. */ }

static Blah()
{
Thread thread = new Thread(ThreadBody);
thread.Start();
thread.Join();
}

static void ThreadBody() { }
}

ECMA CLI spec 的第 10.5.3.3 节“竞争和死锁”保证以下内容:

Type initialization alone shall not create a deadlock unless some code called from a type initializer (directly or indirectly) explicitly invokes blocking operations.

因此,只要静态构造函数中没有任何操作阻塞线程,类型初始化器(即静态构造函数)就不会死锁。如果静态构造函数确实阻塞,则有死锁的风险。

关于c# - Plinq 语句在静态构造函数中陷入僵局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5770478/

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