如果你在Mac上运行
GOEXPERIMENT=staticlockranking go test strings
,它会失败得很惨,因为在持有与execLock.rlock冲突的各种锁时可以调用preemptM。具体来说:
// On Darwin, don't try to preempt threads during exec.
// Issue #41702.
if GOOS == "darwin" || GOOS == "ios" {
execLock.rlock()
}
这表明macOS和iOS上可能存在真正的死锁,尽管尚未报告。所以如果能发生的话,可能是非常罕见的。不清楚如何解决这个问题。
/cc @aclements
3条答案
按热度按时间zf9nrax11#
锁仅在调用
syscall.Exec
时保持,这种情况非常罕见。潜在死锁的时间非常短。n7taea2i2#
我们可能需要修改代码,以便在
preemptM
处获取锁之前,我们只需检查当前是否处于syscall.Exec
。如果是这样,我们可以跳过抢占信号。最有可能的是,进程无论如何都会消失。如果它没有消失,我们将有机会再次抢占线程。atmip9wb3#
我在https://go.dev/cl/555055中更彻底地建模了rwmutex,这可能是为什么它现在才出现的原因。此外,我们还没有一个darwin静态锁等级构建器。