从多个goroutine添加到等待组是否安全?

时间:2018-12-13 19:57:27

标签: go concurrency goroutine

如果我有多个go例程,同时向一个等待组添加和调用完成。从并发角度来看这安全吗?我见过的大多数等待组示例都将添加操作保留在一个调用/创建其他例程的go例程中。

1 个答案:

答案 0 :(得分:3)

从多个例程中调用Done是安全的,建议每the documentation使用WaitGroup。从产生更多例程的goroutine中调用Add的原因不是因为Add不是线程安全的,而是因为这样的代码的可能性:

for ... {
    go func() {
        wg.Add(1)
        defer wg.Done()
        ...
    }()
}
wg.Wait()

当计数器仍为零时,可能在执行对wg.Wait()的任何调用之前进入Add,从而破坏了目的。并发代码的执行顺序是不确定的。