从多个 goroutine 添加到等待组是否安全?
Is it safe to add to a waitgroup from multiple goroutines?
如果我有多个 go 例程同时添加和调用等待组完成。从并发的角度来看,这安全吗?我见过的大多数等待组示例都将添加添加到 calls/creates 其他例程中。
从多个例程调用 Done
是安全的,并且是 WaitGroup
per the documentation 的推荐用法。从生成更多例程的 goroutine 调用 Add
的原因不是因为 Add
不是线程安全的,而是因为这样的代码的可能性:
for ... {
go func() {
wg.Add(1)
defer wg.Done()
...
}()
}
wg.Wait()
可能会在对 Add
的任何调用被执行之前到达 wg.Wait()
,此时计数器仍为零,从而破坏了目的。并发代码的执行顺序是不确定的。
如果我有多个 go 例程同时添加和调用等待组完成。从并发的角度来看,这安全吗?我见过的大多数等待组示例都将添加添加到 calls/creates 其他例程中。
从多个例程调用 Done
是安全的,并且是 WaitGroup
per the documentation 的推荐用法。从生成更多例程的 goroutine 调用 Add
的原因不是因为 Add
不是线程安全的,而是因为这样的代码的可能性:
for ... {
go func() {
wg.Add(1)
defer wg.Done()
...
}()
}
wg.Wait()
可能会在对 Add
的任何调用被执行之前到达 wg.Wait()
,此时计数器仍为零,从而破坏了目的。并发代码的执行顺序是不确定的。