登录
首页 >  Golang >  Go问答

waitGroup 计数器为负的原因是什么

来源:stackoverflow

时间:2024-03-18 12:00:32 482浏览 收藏

**WaitGroup 计数器为负的原因** 在使用 Go 语言的 WaitGroup 时,如果出现负的计数器错误,通常是因为对 WaitGroup 的使用方式不当。WaitGroup 旨在协调并发例程,并在所有例程完成时通知主程序。如果在例程执行之前增加计数器,而在执行后减少计数器,可能会导致负计数器。这是因为在例程执行期间,主程序可能已经调用了 WaitGroup 的 Wait 方法,从而导致计数器变为负数。为了避免这种情况,建议传递 WaitGroup 变量的指针,而不是直接传递变量本身。这样可以确保所有例程都使用同一份 WaitGroup 实例,避免出现计数器错误。

问题内容

我正在尝试理解 go 例程并尝试一些代码。 这确实让我感到好奇。它打印两个或多个值,然后出现错误

恐慌:同步:负 waitgroup 计数器

func processTheInt(i int, wg sync.WaitGroup){
    fmt.Println(i)
    wg.Done()

}


func main(){
    var waitGroup sync.WaitGroup

    for {
        theInt := rand.Intn(100)
        waitGroup.Add(1)
        go processTheInt(theInt, waitGroup)
    }

}

有人可以解释为什么会发生这种情况吗?在执行 go func processtheint 之前,我增加了计数器。该函数在打印后执行并减少它。是因为打印时间比启动功能要长吗?


解决方案


您应该传递一个指向 waitgroup 变量的指针

func processTheInt(i int, wg *sync.WaitGroup){
    fmt.Println(i)
    wg.Done()

}

func main(){
    var waitGroup sync.WaitGroup

    for {
        theInt := rand.Intn(100)
        waitGroup.Add(1)
        go processTheInt(theInt, &waitGroup)
    }

}

否则它将在每次 for 迭代时复制该结构。

Read this to know the difference

今天关于《waitGroup 计数器为负的原因是什么》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

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