【发布时间】:2023-03-05 21:50:01
【问题描述】:
我正在阅读The Little Go Book。
第 76 页演示了如何使用单个锁进行死锁:
var (
lock sync.Mutex
)
func main() {
go func() { lock.Lock() }()
time.Sleep(time.Millisecond * 10)
lock.Lock()
}
按照作者的解释,运行它会导致死锁。但是,我不明白为什么。
我把程序改成了这样:
var (
lock sync.Mutex
)
func main() {
go func() { lock.Lock() }()
lock.Lock()
}
我的预期是仍然会抛出死锁。但事实并非如此。
谁能给我解释一下这里发生了什么?
我能想到的唯一可以解释这一点的场景如下(但这是猜测):
第一个例子
- 在第一个 goroutine 中获取锁
- 调用
time.Sleep()确保获得锁 -
main函数尝试获取锁导致死锁 - 程序退出
第二个例子
- 在第一个 goroutine 中获得了锁,但这需要一些时间才能发生 (??)
- 由于没有延迟,
main函数在 goroutine 可以之前获取锁 - 程序退出
【问题讨论】:
-
我认为程序在 goroutine 启动之前就退出了,没有延迟。
-
另请注意,第一个示例也不能保证死锁,它只是在标准 Go 实现的大多数合理情况下发生。