首页 >后端开发 >Golang >使用Go的sync.WaitGroup时如何避免死锁?

使用Go的sync.WaitGroup时如何避免死锁?

Patricia Arquette
Patricia Arquette原创
2024-12-07 13:34:13907浏览

How to Avoid Deadlocks When Using Go's sync.WaitGroup?

使用sync.WaitGroup时排查死锁错误

使用并发Go例程时,处理同步对于避免死锁至关重要。当尝试协调多个 goroutine 并使用sync.WaitGroup 等待它们完成时,就会出现这样的一种情况。然而,有时,你可能会遇到错误:“致命错误:所有 goroutine 都在睡眠 - 死锁!”。

此错误源于sync.WaitGroup 的错误使用。在提供的代码片段中:

import "sync"

func doWork(wg sync.WaitGroup) error {
    defer wg.Done()
    // Do some heavy lifting... request URL's or similar
    return nil
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go doWork(wg)
    }
    wg.Wait()
}

问题在于将sync.WaitGroup对象直接传递给doWork函数。当按值传递值时,会创建对象的副本,这会导致意外行为。

修复涉及将指针传递给sync.WaitGroup:

import "sync"

func doWork(wg *sync.WaitGroup) error {
    defer wg.Done()
    // Do some heavy lifting... request URL's or similar
    return nil
}

func main() {
    wg := &sync.WaitGroup{}
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go doWork(wg)
    }
    wg.Wait()
}

通过传递一个指针,每个 goroutine 将引用相同的 WaitGroup 对象,确保在预期实例上调用 Done() 。这解决了死锁问题,让程序能够无错误地执行。

记住,当使用sync.WaitGroup同步goroutine时,一定要传递一个指向对象的指针,以确保行为一致并避免潜在的死锁。

以上是使用Go的sync.WaitGroup时如何避免死锁?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn