You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向通道切片中的整型通道发送数据时出现死锁如何解决?

死锁根因

代码中channels := make([]chan int, 5)仅初始化了长度为5的通道切片,切片内的5个通道元素均为nil通道。Go语言中对nil通道的收发操作都会永久阻塞:

  • send协程执行到channels[i%5] <- i时,向nil通道发值直接陷入阻塞,无法完成后续的通道关闭逻辑
  • recive协程的5个子协程尝试从nil通道读值,也会永久阻塞,永远不会向fanInChan写入数据、也不会执行wg.Done()
  • 主协程一直阻塞在range fanInChan等待接收数据,所有协程全部陷入休眠,最终触发死锁。
修复方案

在创建channels切片后,逐个初始化切片内的所有通道即可:

func main() {
    defer fmt.Println("About to exit!")
    fmt.Println("Started")

    channels := make([]chan int, 5)
    // 新增初始化每个通道的逻辑
    for i := range channels {
        channels[i] = make(chan int)
        // 若需要更高吞吐量也可以设置带缓冲的通道:channels[i] = make(chan int, 20)
    }
    fanInChan := make(chan int)

    go send(channels)
    go recive(fanInChan, channels)

    for val := range fanInChan {
        fmt.Println("Fanin", val)
    }
}

修复后即可正常完成所有数据的发送、接收、扇入逻辑,不会再触发死锁。

内容的提问来源于stack exchange,提问作者DTan13

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 14:45:03