package main
import "fmt"
func worker(start chan int, index int) {
start <- index
fmt.Println("This is Worker:", index)
}
func main() {
start := make(chan int, 5)
for i := 1; i <= 10; i++ {
go worker(start, i)
}
/*
//用这种方法没有问题
for j := 1; j <= 10; j++ {
<-start
}
*/
for v := range start {
fmt.Println(v)
}
fmt.Println("Finished")
//deadlock we expected
}
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
分析问题应该是出在用FOR ... RANGE 这种方法读取CHAN这一块,因为实际上START到底有多少系统并不知道(除非显式的close(chan) ),所以一直在读取CHAN,而CHAN一直没有数据,就阻塞了{ goroutine 1 [chan receive]: }。而用上面注释代码指定次数的方法就避免了这种阻塞,所以这里会出错,不知道这样理解对不对?
就是一个写,一个读取的,用了BUFFER,还提示阻塞了。应该是理解的不对的,帮指点下!
我也刚学的。 是不需要显示关闭channel。
在这个函数中加一个判断
func worker(start chan int, index int) {
start <- index
fmt.Println("This is Worker:", index)
if index == 10 {
close(start)
}
}
#1
更多评论