【问题标题】:fatal error all goroutines are asleep deadlock [duplicate]致命错误所有goroutines都睡着了死锁[重复]
【发布时间】:2016-04-06 22:37:10
【问题描述】:

您能否解释以下错误:致命错误:
真的
真的
所有 goroutine 都处于休眠状态 - 死锁!

package main

import (
    "fmt"
)

func printer(ch chan bool) {
    ch <- true
}

func main() {
    var c chan bool = make(chan bool, 2)

    for i := 0; i < 5; i++ {
        go printer(c)
    }

    for i := range c {
        fmt.Println(i)
    }
}

【问题讨论】:

  • 我没有得到相同的输出。在 1.5.2 上,它按预期打印 - 五个“真实”行然后它死锁,因为通道没有被关闭并且范围循环只是永远等待

标签: go


【解决方案1】:

因为通道c没有关闭,范围循环没有退出。此代码不会阻塞:

func main() {
  var c chan bool = make(chan bool, 2)

  for i := 0; i < 5; i++ {
    go printer(c)
  }

  for i := 0; i < 5; i++ {
    fmt.Println(<-c)
  }
}

playground example

【讨论】:

  • 为什么范围不自动停止?
  • @inanc 范围在通道关闭时停止。否则,它会阻塞等待值。
猜你喜欢
  • 1970-01-01
  • 2023-02-01
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多