从多个 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(),此时计数器仍为零,从而破坏了目的。并发代码的执行顺序是不确定的。