【问题标题】:Is it safe to add to a waitgroup from multiple goroutines?从多个 goroutine 添加到等待组是否安全?
【发布时间】:2018-12-13 19:57:26
【问题描述】:

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

【问题讨论】:

    标签: go concurrency goroutine


    【解决方案1】:

    从多个例程调用Done 是安全的,并且是WaitGroupthe documentation 的推荐用法。从产生更多例程的goroutine调用Add的原因不是因为Add不是线程安全的,而是因为这样的代码可能:

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

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

    【讨论】:

    • “add” go-routine 创建了“done” go-routine,我可以在启动时添加(1)(然后让我的“stop”函数调用额外的 done 然后调用 wait) ,所以看起来我会没事的。谢谢!我会在几分钟后接受。
    • 这是一种方法,但不如文档中示例中使用的推荐样式清晰。
    • 好吧,它使用了一个 httpserver,它为每个请求创建一个新的例程。我想这是可以使用频道的地方
    • 这似乎是一个非常不规则的设计,值得多加思考。服务器的正常关闭不是应用 WaitGroup 的简单问题,通道肯定不会有帮助。在请求关闭之前,您可能根本不想调用Wait,在这种情况下,您可以在处理程序例程中调用AddDone,并在停止后调用Wait Listener.
    • 是的,add(1) 不是必需的,因为直到 httpserver 停止后才会调用 wait。我的停止功能关闭服务器,然后关闭处理程序。防止程序异常退出的运行服务器是我缺少的部分。再次感谢!
    猜你喜欢
    • 2013-01-19
    • 2018-04-05
    • 2018-02-24
    • 2023-03-10
    • 2019-06-05
    • 2019-07-18
    • 2021-07-07
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多