登录
首页 >  Golang >  Go问答

出现“致命错误:所有 goroutine 都处于睡眠状态 - 死锁!” 使用 sync.WaitGroup 时

来源:Golang技术栈

时间:2023-04-13 17:21:47 243浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《出现“致命错误:所有 goroutine 都处于睡眠状态 - 死锁!” 使用 sync.WaitGroup 时》,就很适合你,本篇文章讲解的知识点主要包括golang。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

我正在尝试剥离一组 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 

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

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

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

正确答案

您需要将指针传递给 WaitGroup,而不是 WaitGroup 对象。当您传递实际的 WaitGroup 时,Go 会复制该值并调用Done()该副本。结果是原始的 WaitGroup 将有 10 个 Add 并且没有 Done,并且 WaitGroup 的每个副本将有一个 Done() ,但是当 WaitGroup 被传递给函数时,那里有很多 Add 。

而是传递一个指针,每个函数都将引用相同的 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 

本篇关于《出现“致命错误:所有 goroutine 都处于睡眠状态 - 死锁!” 使用 sync.WaitGroup 时》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

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