gpt4 book ai didi

go - 为什么这个 Go 程序没有像预期的那样进入死锁状态?

转载 作者:IT王子 更新时间:2023-10-29 02:32:51 25 4
gpt4 key购买 nike

我是Go新手,写了这段代码希望它进入死锁状态,但是失败了。

var mux sync.Mutex

func main() {
runtime.GOMAXPROCS(1)
for i := 0; i < 3; i++ {
go func() {
log.Println("Trying to Lock the Mux")
mux.Lock()
log.Println("The mux is Locked")
}()
}
runtime.Gosched()
}
//Output:
//2017/01/17 08:59:42 Trying to Lock the Mux
//2017/01/17 08:59:42 The mux is Locked
//2017/01/17 08:59:42 Trying to Lock the Mux
//2017/01/17 08:59:42 Trying to Lock the Mux

如您所见。此代码运行良好并打印一些内容,然后退出而没有任何死锁错误。据我所知,第一个 go func(){} goroutine 已返回并锁定 mux,然后退出。但是另外两个 goroutine 会被阻塞,因为 mux 已经阻塞了。

runtime.Gosched() 函数应该将主 goroutine 推送到唯一的 FIFO 队列(runtime.GOMAXPROCS(1)) 对吗?为什么它可以在已经在队列中的左边两个goroutine之前执行?

顺便说一句,下面的代码将按预期返回死锁错误

var mux sync.Mutex

func main() {
runtime.GOMAXPROCS(1)
var wg sync.WaitGroup
wg.Add(3)
for i := 0; i < 3; i++ {
go func() {
defer wg.Done()
log.Println("Trying to Lock the Mux")
mux.Lock()
log.Println("The mux is Locked")

}()
}
wg.Wait()
}

谢谢!

最佳答案

死锁是一种情况,其中所有 goroutines 都处于等待状态(等待锁定或从 channel 读取等)。原因很简单,如果所有的 goroutine 都在等待,那么就没有人可以做一些事情来让任何正在等待的 goroutines 继续。在您的情况下,您的主要功能(也是一个 goroutine)不处于等待状态。当主 goroutine 退出时,进程也会退出。

The function runtime.Gosched() should push the main goroutine to the only FIFO queue(runtime.GOMAXPROCS(1)) right? why it can be excute before the left two goroutine that already in the queue?

队列是调度队列。运行时将从队列中选择一个 goroutine,运行它一段时间,暂停它,选择另一个 goroutine。

关于go - 为什么这个 Go 程序没有像预期的那样进入死锁状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41687657/

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