sync.waitgroup奇怪的地方

tommytian770401 · · 951 次点击
package main import ( "fmt" "math/rand" "sync" "time" ) func main() { var wg sync.WaitGroup ch := make(chan int) sum := 0 count := 5 for i := 1; i <= count; i++ { wg.Add(1) go func(ch chan int, index int) { //发起多个协程 time.Sleep(time.Duration(rand.Intn(5)+1) * time.Second) ch <- index//模拟随机时间返回数值 }(ch, i) } go func(ch chan int, result *int, _wg *sync.WaitGroup) { for c := range ch { *result += c fmt.Println(c) //执行到最后一个chan的时候有可能没有机会显示 _wg.Done() } }(ch, &sum, &wg) wg.Wait() fmt.Println("sum is done") fmt.Println(sum) }
#4
更多评论
多试几次,不一定是最后一次,结果也不一定是***15***,你这写法有不确定性,只要每个`go`协程中的`defer wg.Done()`执行完`sum`就会被打印出来,无论`ch`中的数据有没有全部被读取出来,这个按照你代码执行的一次结果 ``` 5 1 4 2 sum is done 12 ```
#1
在最后加一个`time.Sleep(6 * time.Second)`就一定能看到了,并发协程未执行完导致的问题。
#2