gpt4 book ai didi

go - 检测同一个 goroutine 连续两次调用 sync.Mutex.Lock()

转载 作者:IT王子 更新时间:2023-10-29 01:43:36 24 4
gpt4 key购买 nike

此代码(单线程程序)将永远无法运行:

func TestDoubleLockPanics(t *testing.T) {
var mu sync.Mutex
mu.Lock()
mu.Lock()
}

但是,当我运行这个测试时,没有出现 panic 。竞争检测器不会打印出数据竞争。 go vet 没有提示,没有日志消息,它只是永远阻塞。

(我关心的实际代码显然不是这么简单 - 我只是将其归结为本质。)

当持有锁的线程试图重新获取同一个锁时,有什么方法可以让 Go 大声告诉我吗?

最佳答案

Go 的 sync.Mutex 对象不会跟踪哪个 goroutine 锁定了它们。或者,换句话说,没有锁定线程:只有数据锁。

此外,正如上面的评论Unlock说,你可以从锁定它们的 goroutine 之外的其他 goroutine 解锁它们。因此,调用 Lock 两次实际上是有意义的。这是一个骨架示例:

func f() {
mu.Lock()
... if this is not just an example, some code goes here ...
// now wait for g() to call mu.Unlock()
mu.Lock()
fmt.Println("we got here, so g() must have done an unlock")
mu.Unlock()
}

func g() {
... some code probably goes here too ...
mu.Unlock() // allow f() to proceed
... more code, perhaps ...
}

在这种情况下,我们不希望 f 的第二个 Lock 调用出现 panic 。

您可以构建自己的递归锁或其他技术,但由于每个 goroutine 的内部 ID 都是隐藏的,因此它是 pretty tricky .有一个链接到 an implementationthis answer 的评论中至 Recursive locking in Go ,但我从未使用过它,甚至没有仔细看过它。

关于go - 检测同一个 goroutine 连续两次调用 sync.Mutex.Lock(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57447879/

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