go 运行时:execLock 在 darwin/ios 系统上可能会发生死锁,

n53p2ov0  于 6个月前  发布在  Go
关注(0)|答案(3)|浏览(46)

如果你在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

zf9nrax1

zf9nrax11#

锁仅在调用syscall.Exec时保持,这种情况非常罕见。潜在死锁的时间非常短。

n7taea2i

n7taea2i2#

我们可能需要修改代码,以便在preemptM处获取锁之前,我们只需检查当前是否处于syscall.Exec。如果是这样,我们可以跳过抢占信号。最有可能的是,进程无论如何都会消失。如果它没有消失,我们将有机会再次抢占线程。

atmip9wb

atmip9wb3#

我在https://go.dev/cl/555055中更彻底地建模了rwmutex,这可能是为什么它现在才出现的原因。此外,我们还没有一个darwin静态锁等级构建器。

相关问题