【发布时间】:2014-08-27 20:45:22
【问题描述】:
我不确定我错过了什么,但我遇到了死锁错误。在所有 go 例程完成后,我正在使用一个缓冲通道。该通道的容量为 4,我正在运行 4 个 go 例程,因此我希望它在达到最大容量后自动“关闭”。
package main
import "fmt"
import "sync"
func main() {
ch := make(chan []int, 4)
var m []int
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func() {
defer wg.Done()
ch <- m
return
}()
}
wg.Wait()
for c := range ch {
fmt.Printf("c is %v", c)
}
}
【问题讨论】:
-
你在哪里填充
m? -
问题是
range ch仍在等待元素进入通道,并且没有 goroutine 可以写。 -
我假设我正在发送一个空/归零切片。即使我在
ch <- m之前添加m = append(m, i),它仍然会陷入僵局。见play.golang.org/p/uAOnq6SdeR -
rangeing 如果您缺少的频道关闭,则通过频道工作。
标签: go