致命錯誤 所有 go 例程都處于休眠狀態。僵局。這是我嘗試過的。我在打電話wg.Done()。缺什么?package mainimport ( "fmt" "strconv" "sync")func sender(wg *sync.WaitGroup, cs chan int) { defer wg.Done() for i := 0; i < 2; i++ { fmt.Println(i) cs <- i }}func reciever(wg *sync.WaitGroup, cs chan int) { x, ok := <-cs for ok { fmt.Println("Retrieved" + strconv.Itoa(x)) x, ok = <-cs if !ok { wg.Done() break } }}func main() { wg := &sync.WaitGroup{} cs := make(chan int, 1000) wg.Add(1) go sender(wg, cs) for i := 1; i < 30; i++ { wg.Add(1) go reciever(wg, cs) } wg.Wait() close(cs)}
2 回答

慕容708150
TA貢獻1831條經驗 獲得超4個贊
您應該先關閉頻道wg.Wait
。
您所有的接收器都在等待來自通道的數據。這就是你陷入僵局的原因。
您可以在函數defer
聲明中關閉通道sender
。如果第一次嘗試從頻道接收失?。ㄒ驗轭l道已經關閉),
您還需要wg.Done()
http://play.golang.org/p/qdEIEFY-kl

慕哥6287543
TA貢獻1831條經驗 獲得超10個贊
- 2 回答
- 0 關注
- 172 瀏覽
添加回答
舉報
0/150
提交
取消