【发布时间】:2018-12-13 19:57:26
【问题描述】:
如果我有多个 go 例程同时向等待组添加和调用 done。从并发的角度来看,这是否安全?我见过的大多数等待组示例都将添加保留在一个调用/创建其他的 go-routine 中。
【问题讨论】:
标签: go concurrency goroutine
如果我有多个 go 例程同时向等待组添加和调用 done。从并发的角度来看,这是否安全?我见过的大多数等待组示例都将添加保留在一个调用/创建其他的 go-routine 中。
【问题讨论】:
标签: go concurrency goroutine
从多个例程调用Done 是安全的,并且是WaitGroup 每the documentation 的推荐用法。从产生更多例程的goroutine调用Add的原因不是因为Add不是线程安全的,而是因为这样的代码可能:
for ... {
go func() {
wg.Add(1)
defer wg.Done()
...
}()
}
wg.Wait()
可能会在对Add 的任何调用执行之前到达wg.Wait(),此时计数器仍为零,从而无法达到目的。并发代码的执行顺序是不确定的。
【讨论】:
Wait,在这种情况下,您可以在处理程序例程中调用Add 和Done,并在停止后调用Wait Listener.