- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我遇到过静态构造函数中的以下 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/
我正在使用 channel 在 Go 中构建一个异步 Btree,但我收到错误 fatal error: all goroutines are asleep - deadlock! 我不知道为什么因为
我正在尝试从字符串线程中明智地读取单词。意味着一个线程读一个单词,当所有单词完成后,所有线程也应该和平退出。在此示例中,字符串中有11个单词,并且有4个线程对该字符串进行操作。但是该程序在运行时被挂起
当我期望 Alpha 表现得像 Beta 时,为什么它会提前停止? Alpha 和 Beta 之间的唯一区别是 >! 和 put!,如下所述。 阿尔法: user=> (def q (chan)) #
当我期望 Alpha 表现得像 Beta 时,为什么它会提前停止? Alpha 和 Beta 之间的唯一区别是 >! 和 put!,如下所述。 阿尔法: user=> (def q (chan)) #
我想使用 C# 自动化第三方 Windows 命令行程序。通常,它是一个交互式控制台,您发送命令,它可能会提示详细信息,发回结果并显示提示以询问更多命令。通常: c:\>console_access.
似乎“复杂”(getC)功能被阻止了。我假设 channel 一旦被读取就会被销毁,因此我想知道如何与 getC 函数和 main 共享 sC channel 函数不会陷入死锁(current sni
我想编写三个相互发送整数的并发 go 例程。现在,我的代码已正确编译,但在第一次执行后出现错误“抛出:所有 goroutines 都睡着了 - 死锁!”。我试图找到错误,但我无法在代码逻辑中找到任何错
这是我的代码,我哪里出错了? func main() { intChan := make(chan int) wg := sync.WaitGroup{} for i := 0;i<5;i
package main import ( "fmt" "runtime" "sync" "time" ) func main() { intInputChan
我是一名优秀的程序员,十分优秀!