【问题标题】:All goroutines are asleep when reading from buffered channel从缓冲通道读取时,所有 goroutine 都处于休眠状态
【发布时间】:2022-08-16 13:36:58
【问题描述】:

func writeToChan(wg *sync.WaitGroup, ch chan int, stop int) {
    defer wg.Done()
    for i := 0; i < stop; i++ {
        ch <- i
    }
}

func readToChan(wg *sync.WaitGroup, ch chan int) {
    defer wg.Done()
    for n := range ch {
        fmt.Println(n)
    }
}

func main() {
    ch := make(chan int, 3)
    wg := new(sync.WaitGroup)    


    wg.Add(2)
    go writeToChan(wg, ch, 5)
    go readToChan(wg, ch)

    wg.Wait()
}
0
1
2
3
4
fatal error: all goroutines are asleep - deadlock!

我假设readToChan 总是连续读取,writeToChan 写入通道并在读取通道时等待。 我不知道为什么我在 WaitGroup 中添加了两个“wait”时输出显示死锁。

    标签: go


    【解决方案1】:

    您需要在发送方关闭通道。 通过使用

    for n := range ch {
        fmt.Println(n)
    }
    

    循环只会在ch 关闭时停止

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 2012-09-06
      • 2019-07-26
      • 2021-04-05
      • 1970-01-01
      • 2017-02-23
      • 2020-12-24
      相关资源
      最近更新 更多