golang的sync.WaitGroup

func Wg() {
   wg := &sync.WaitGroup{}
   go wgCore(1, wg)
   go wgCore(2, wg)
   go wgCore(3, wg)
   wg.Wait()
}
func wgCore(i int64, wg *sync.WaitGroup) {
   wg.Add(1)
   defer wg.Done()
   fmt.Println(i)
}

当我调用Wg()的时候并没有得到如期的结果,我知道问题出在 wg.Add(1)上,我也知道修改为以下代码结果就如预期了

func Wg() {
   wg := &sync.WaitGroup{}
   wg.Add(3)
   go wgCore(1, wg)
   go wgCore(2, wg)
   go wgCore(3, wg)
   wg.Wait()
}
func wgCore(i int64, wg *sync.WaitGroup) {
   defer wg.Done()
   fmt.Println(i)
}

但是不知道该怎么解释,还靠各位大佬指点!

阅读 2.5k
3 个回答

你不事先设置add的值的话,而是分批add的话,wg.Wait()无法判断是否add结束,所以没有在你的预期内

启动goroutine是有开销的,虽然时间很短但是也不能认为可以忽略。
因此第一段代码中第三个go后面你休息一秒钟就符合预期了

goroutine 执行速度问题

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题