【发布时间】:2019-12-27 23:29:42
【问题描述】:
我不明白为什么下面的代码会导致死锁...谁能帮帮我?
在什么情况下,通道会陷入僵局?我真的很困惑……
下面的代码是按这个顺序打印字母和数字 “12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728” 我想使用通道来实现这个目标,但陷入僵局。 删除 numberDone 频道时,一切正常。
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
【问题讨论】:
-
对不起,我错过了一些错误信息。实际输出为: 12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728 致命错误:所有goroutines are sleep - deadlock! goroutine 1 [chan 接收]: main.AlterPrint() /home/runner/alter_print.go:62 +0x157 main.main() /home/runner/main.go:4 +0x20 goroutine 18 [chan send]: main. AlterPrint.func1(0xc000074180, 0xc0000740c0, 0xc000074060) /home/runner/alter_print.go:27 +0x148 由 main.AlterPrint 创建 /home/runner/alter_print.go:14 +0xd9 退出状态 2