为了账号安全,请及时绑定邮箱和手机立即绑定

使用for循环遍历通道时出现Goroutine死锁

使用for循环遍历通道时出现Goroutine死锁

Go
慕尼黑的夜晚无繁华 2023-06-26 17:11:09
我正在尝试练习 goroutine 和通道,但我遇到了调用 gorouting 和传递通道的问题。Goroutine 将数据推送到通道中,然后主线程将打印元素。我已经使用 for 循环来打印内容但是得到了。fatal error: all goroutines are asleep - deadlock!21goroutine 1 [chan receive]:main.main()package mainimport "fmt"func smallThread(a int, c chan int) {    c <- a}func main() {    c := make(chan int)    go smallThread(1, c)    go smallThread(2, c)    for {        fmt.Println(<-c)    }}编辑:使用等待组:func smallThread(a int, c chan int, w *sync.WaitGroup) {    c <- a    w.Done()}func main() {    c := make(chan int)    var w sync.WaitGroup    w.Add(2)    go smallThread(1, c, &w)    go smallThread(2, c, &w)    //w.Wait()    for i := range c {        fmt.Println(i)    }    w.Wait()}EDIT2:工作代码func smallThread(a int, c chan int, w *sync.WaitGroup) {    //defer w.Done()    c <- a    w.Done()}func main() {    c := make(chan int)    var w sync.WaitGroup    w.Add(1)    go smallThread(1, c, &w)    w.Add(1)    go smallThread(2, c, &w)    go func(c chan int) {        for i := range c {            fmt.Println(i)        }    }(c)    w.Wait()}
查看完整描述

2 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

当 goroutine 完成后,关闭通道以指示不再添加任何值。当接收到所有值后,for 循环将中断。


c := make(chan int)

var w sync.WaitGroup

w.Add(2)

go smallThread(1, c, &w)

go smallThread(2, c, &w)

go func() {

    w.Wait()

    close(c)

}()


for i := range c {

    fmt.Println(i)

}


查看完整回答
反对 回复 2023-06-26
?
DIEA

TA贡献1820条经验 获得超2个赞

不确定你的问题是什么,但我会告诉你会发生什么。你的两侧 goroutine 将它们的数字推送到通道并退出。然后主 goroutine(此时只剩下唯一的一个)将永远阻塞,等待另一个元素从通道中出来。



查看完整回答
反对 回复 2023-06-26
  • 2 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信