var wg sync.WaitGroup
var v int32 = 0
for i = 0; i < 100; i++{
go func(){
wg.Add(1) // wrong place
atomic.AddInt32(&v,1)
wg.Done()
}
}
wg.Wait()
fmt.Println(v)
这是我从该视频中看到的一段代码https://subscription.packtpub.com/video/application_development/9781788994880/97598/97608/goroutines
但是v总是小于100,我认为原因可能是wg.Wait()比预期更早结束,因为我们把wg.Add(1)匿名函数放在里面,并且在同一个 goroutinewg.Done()中会立即被调用,因此 main goroutine 从阻塞状态恢复执行。
但是如果我们将wg.Add(1)放入 for 循环中, v 将永远是100。
var wg sync.WaitGroup
var v int32 = 0
for i = 0; i < 100; i++{
wg.Add(1)
go func(){
atomic.AddInt32(&v,1)
wg.Done()
}
}
wg.Wait()
fmt.Println(v)
我的问题是为什么我们可以保证 main goroutine 总是会在这里阻塞,使得 v 最终等于 100。如果在 for 循环之前添加一个任务到wg, 并且 main goroutine 在这里恢复执行,那是否可能,因为此时没有任务。
慕田峪7331174
吃鸡游戏
相关分类