问答详情
源自:2-2 Hello World并发版

运行 deadlock

package main

import (
   "fmt"
)

func main() {
   ch := make(chan string)
   for i := 0; i < 5; i++ {
      go printHello(i, ch)
   }

   for {
      message := <-ch
      fmt.Println(message)
   }
}

func printHello(i int, ch chan string) {
   message := fmt.Sprintf("groutine %d send u message", i)
   fmt.Println(message)
   ch <- message
}

以上是我运行的代码,执行结果:

fatal error: all goroutines are asleep - deadlock!
groutine 4 send u message
groutine 4 send u message
goroutine 1 [chan receive]:
groutine 1 send u message
main.main()
groutine 1 send u message
groutine 0 send u message
/Users/donng/go/src/practice/cmd/hello-world/main.go:14 +0x9e
groutine 2 send u message


提问者:晓之海绵宝宝 2018-06-27 14:44

个回答

  • 晓之海绵宝宝
    2018-06-27 15:32:17

    经过测试找到问题了,原文中用

       for {     
        message := <-ch      
        fmt.Println(message)   
       }

    这种写法,在 for 循环到最后, ch 没有数据时,程序死锁。

  • 晓之海绵宝宝
    2018-06-27 14:52:31

    我将接收部分修改为以下,就可以了,不过很奇怪为什么老师的 5000 个,没有出现死锁。

    go func(ch chan string) {
       for {
          message := <-ch
          fmt.Println(message)
       }
    }(ch)