登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-03-16 12:12:23 319浏览 收藏

从多个 goroutine 添加到等待组并调用 done 是线程安全的,这是 waitgroup 推荐的用法。然而,从生成更多 goroutine 的 goroutine 调用 add 可能不安全,因为并发代码的执行顺序是不确定的。如果在执行任何对 add 的调用之前达到 wg.wait(),可能会导致计数器仍然为零,从而无法达到预期目的。因此,通常建议将 add 保留在一个单独的 goroutine 中,以避免这种潜在问题。

问题内容

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


解决方案


从多个例程调用 done 是安全的,并且是每 the documentation 推荐使用 waitgroup。从生成更多例程的 goroutine 调用 add 的原因不是因为 add 不是线程安全的,而是因为代码可能像这样:

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

当计数器仍为零时,可能会在执行对 add 的任何调用之前到达 wg.wait(),从而达不到目的。并发代码的执行顺序是不确定的。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>