【问题标题】:Why error "all goroutines are asleep - deadlock"? (WaitGroup and channels)为什么会出现“所有 goroutines 都睡着了 - 死锁”的错误? (WaitGroup 和频道)
【发布时间】: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 &lt;- 0) 上,就在 wg.Wait() 之前。
  • 你的 prgram 正在死锁,因为所有的 goroutines,包括 main,都被阻塞在等待某个东西。更具体地说,程序产生的例程试图从从未写入的通道中读取。如果ch3 被写入,ch 被写入,ch3 如果ch2 被写入,ch2 如果ch 被写入,并且(参见递归性)ch 如果@987654332 被写入写了@。按照蒂姆·库珀的建议进行初步写作。

标签: go goroutine


【解决方案1】:

因为在初始化无缓冲通道中,如果从空通道中拉取项目,它将被阻塞。所以你需要做的是在等待之前向主 goroutine 中的 ch 发送一个信号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 2016-04-06
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    相关资源
    最近更新 更多