六、WaitGroup

(1) WaitGroup与goroutine的竞速问题

编译并运行如下代码会发生什么?

test18.go

  1. package main
  2. import (
  3. "sync"
  4. //"time"
  5. )
  6. const N = 10
  7. var wg = &sync.WaitGroup{}
  8. func main() {
  9. for i := 0; i < N; i++ {
  10. go func(i int) {
  11. wg.Add(1)
  12. println(i)
  13. defer wg.Done()
  14. }(i)
  15. }
  16. wg.Wait()
  17. }

结果

  1. 结果不唯一,代码存在风险, 所有go未必都能执行到

这是使用WaitGroup经常犯下的错误!请各位同学多次运行就会发现输出都会不同甚至又出现报错的问题。 这是因为go执行太快了,导致wg.Add(1)还没有执行main函数就执行完毕了。 改为如下试试

  1. package main
  2. import (
  3. "sync"
  4. )
  5. const N = 10
  6. var wg = &sync.WaitGroup{}
  7. func main() {
  8. for i:= 0; i< N; i++ {
  9. wg.Add(1)
  10. go func(i int) {
  11. println(i)
  12. defer wg.Done()
  13. }(i)
  14. }
  15. wg.Wait()
  16. }