【发布时间】:2021-03-18 10:48:49
【问题描述】:
我正在尝试按顺序将数字 1 到 9 打印到控制台。我正在尝试使用 goroutines 和通道,但为什么会出现错误:致命错误:所有 goroutines 都在休眠 - 死胡同!。
你能告诉我是什么问题吗?我该怎么做?
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
wg.Add(3)
ch := make(chan int)
ch2 := make(chan int)
ch3 := make(chan int)
go func() {
for _, value := range []int{1, 4, 7} {
<-ch
fmt.Println(value)
ch2 <- 0
}
wg.Done()
}()
go func() {
for _, value := range []int{2, 5, 8} {
<-ch2
fmt.Println(value)
ch3 <- 0
}
wg.Done()
}()
go func() {
for _, value := range []int{3, 6, 9} {
<-ch3
fmt.Println(value)
ch <- 0
}
wg.Done()
}()
wg.Wait()
}
【问题讨论】:
-
在你的主 go 例程中将一个值放到
ch通道 (ch <- 0) 上,就在wg.Wait()之前。 -
你的 prgram 正在死锁,因为所有的 goroutines,包括 main,都被阻塞在等待某个东西。更具体地说,程序产生的例程试图从从未写入的通道中读取。如果
ch3被写入,ch被写入,ch3如果ch2被写入,ch2如果ch被写入,并且(参见递归性)ch如果@987654332 被写入写了@。按照蒂姆·库珀的建议进行初步写作。