gpt4 book ai didi

go - 为什么这会导致死锁?

转载 作者:数据小太阳 更新时间:2023-10-29 03:29:34 25 4
gpt4 key购买 nike

我不明白为什么下面的代码会导致死锁...任何人都可以帮助我吗?

什么情况下 channel 会死锁?我真的很困惑......

下面的代码是按顺序打印字母和数字“12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728”我想使用 channel 来实现这个目标,但遇到了僵局。删除 numberDone channel 时,一切正常。

import (
"fmt"
)

func main() {
AlterPrint()
}

// POINT: communicate between goroutines by channel

func AlterPrint(){
letter, number := make(chan bool), make(chan bool)
letterDone := make(chan bool)
numberDone := make(chan bool)
go func() {
i := 1
for {
if i > 28 {
numberDone <- true
return
}
select{
case <-number: {
fmt.Print(i)
i++
fmt.Print(i)
i++
letter <- true
break
}
default: {
break
}
}

}
}()

go func(){
i := 'A'
for {
if i > 'Z' {
letterDone <- true
return
}
select{
case <-letter: {
fmt.Print(string(i))
i++
fmt.Print(string(i))
i++
number <- true
break
}
default: {
break
}
}
}
}()
number <- true
<- letterDone
<- numberDone
}```

I expect the output of "12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728",
but the actual output is
goroutine 1 [chan receive]:
main.AlterPrint()
/tmp/54841538.go:66 +0x183
main.main()
/tmp/54841538.go:7 +0x14

goroutine 5 [chan send]:
main.AlterPrint.func1(0xc82000c240, 0xc82000c180, 0xc82000c120)
/tmp/54841538.go:31 +0x25a
created by main.AlterPrint
/tmp/54841538.go:40 +0xde
exit status 2

最佳答案

它实际上应该打印出您所期望的,然后死锁。第二个 goroutine 完成一切,发送 letterdone 并终止。那时,main 开始等待 numberdone。第一个 goroutine 打印最后两个数字,并在 letter<-true 处开始等待。这就是僵局,在这一点上没有任何进展。尝试使用 fmt.Println 而不是 Print,可能是因为缓冲,它没有打印所有内容。

关于go - 为什么这会导致死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57612740/

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