得到“致命错误:所有 goroutine 都睡着了 - 死锁!

我正在尝试剥离一组 goroutine,然后等待它们全部完成。


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()

}

但是,当我运行此代码时,出现以下错误:


fatal error: all goroutines are asleep - deadlock!


goroutine 16 [semacquire]:

sync.runtime_Semacquire(0xc20818c658)

    /usr/local/Cellar/go/1.3/libexec/src/pkg/runtime/sema.goc:199 +0x30

sync.(*WaitGroup).Wait(0xc2080544e0)

    /usr/local/Cellar/go/1.3/libexec/src/pkg/sync/waitgroup.go:129 +0x14b

main.main()

    /Users/kevin/code/vrusability/scripts/oculus_share_ratings.go:150 +0x398

我很困惑,因为我几乎完全按照文档示例演示的方式编写了它。


芜湖不芜
浏览 249回答 2
2回答

SMILET

您需要传递一个指向 WaitGroup 的指针,而不是 WaitGroup 对象。当您传递实际的 WaitGroup 时,Go 会复制该值,并调用Done()该副本。结果是原始的WaitGroup 将有10 个Add 并且没有Done,并且WaitGroup 的每个副本将有一个Done() 并且当WaitGroup 传递给函数时有多少Add。而是传递一个指针,每个函数都将引用相同的 WaitGroup。import "sync"func doWork(wg *sync.WaitGroup) error {&nbsp; &nbsp; defer wg.Done()&nbsp; &nbsp; // Do some heavy lifting... request URL's or similar&nbsp; &nbsp; return nil}func main() {&nbsp; &nbsp; wg := &sync.WaitGroup{}&nbsp; &nbsp; for i := 0; i < 10; i++ {&nbsp; &nbsp; &nbsp; &nbsp; wg.Add(1)&nbsp; &nbsp; &nbsp; &nbsp; go doWork(wg)&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go