如果我有多个go例程,同时向一个等待组添加和调用完成。从并发角度来看这安全吗?我见过的大多数等待组示例都将添加操作保留在一个调用/创建其他例程的go例程中。
答案 0 :(得分:3)
从多个例程中调用Done
是安全的,建议每the documentation使用WaitGroup
。从产生更多例程的goroutine中调用Add
的原因不是因为Add
不是线程安全的,而是因为这样的代码的可能性:
for ... {
go func() {
wg.Add(1)
defer wg.Done()
...
}()
}
wg.Wait()
当计数器仍为零时,可能在执行对wg.Wait()
的任何调用之前进入Add
,从而破坏了目的。并发代码的执行顺序是不确定的。