```go
package main
import "fmt"
//需求 计算1到20000的2倍
//就是用一个go程inputer来产生数据,写入ch中,然后用多个go程从ch中读走数据,然后乘以2操作
//当某个go程把ch最后一个数据读走后,将quit通道写入数据
//主go程读走quit通道数据后,结束程序
func inputer(ch chan<- int) {
for i := 1; i<=20000; i++ {
ch <- i
}
close(ch)
}
func counter(ch <-chan int, quit chan<- bool) {
num, ok := <-ch
if !ok {
quit <- true
}
fmt.Println(num * 2)
}
func main (){
ch := make(chan int, 100)
quit := make(chan bool)
go inputer(ch)
for i := 0; i < 500; i++ {
go counter(ch, quit)
}
<- quit
}
```
可是最后程序报错`fatal error: all goroutines are asleep - deadlock!`,对于quit通道来说,它是一个无缓冲的同步通道,某个子go程写入数据后,其他子go程都应该阻塞,只有等着主go程读走quit中的数据后,然后就直接结束程序了,为什么有死锁现象?请大佬们解答一下。。:sob:
更多评论
http://topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/channel.html 关于Channel的一些中文手册希望可以帮你
#1
每个counter读一次,一共读500次
ch的buf一共100次
每个inputer写20000次,一共写20000次
所以inputer没有写完,自然不会quit
这是数学问题,不是代码问题
#2