首頁 > 後端開發 > Golang > 如何避免'致命錯誤:所有 goroutine 都在睡覺 - 死鎖!”與sync.WaitGroup?

如何避免'致命錯誤:所有 goroutine 都在睡覺 - 死鎖!”與sync.WaitGroup?

Susan Sarandon
發布: 2024-12-21 06:57:09
原創
390 人瀏覽過

How to Avoid

理解「致命錯誤:所有goroutine 都在睡覺- 死鎖!」使用sync.WaitGroup

當嘗試使用sync.WaitGroup。來管理並發goroutine時,避免可怕的“致命錯誤:所有goroutines都在睡眠 -死鎖!此錯誤是由於 WaitGroup 的錯誤使用而引起的,特別是透過複製而不是引用傳遞值時。

死鎖的原因

問題源自於事實上,當您將實際的 WaitGroup 物件傳遞給 doWork 函數時,Go 會複製該值。這意味著原始 WaitGroup 會將計數器增加十次 Add() 調用,而沒有任何相應的 Done() 呼叫。相較之下,傳遞給 goroutine 的 WaitGroup 的每個副本將只有一次 Done() 呼叫以及複製 WaitGroup 時存在的 Add() 呼叫的數量。

解決方案:傳遞指向 WaitGroup 的指標

要解決此死鎖,必須將指標傳遞給 WaitGroup 而不是 WaitGroup 物件本身。這可以確保所有 goroutine 引用相同的 WaitGroup,並且當它們呼叫 Done() 時,遞減計數器將應用於正確的 WaitGroup。

修改的代碼

以下修改後的代碼演示了指向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()
}
登入後複製

通過採用這種方法的正確用法:

通過採用這種方法的正確用法:通過採用這種方法的正確用法:通過採用這種方法的正確用法:通過採用這種方法的正確用法:通過採用這種方法,您可以使用WaitGroup 自信地管理goroutine,避免死鎖的陷阱並確保高效的並發執行。

以上是如何避免'致命錯誤:所有 goroutine 都在睡覺 - 死鎖!”與sync.WaitGroup?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板