首頁 >後端開發 >Golang >為什麼使用 `sync.WaitGroup` 會導致'致命錯誤:所有 goroutine 都在睡眠 - 死鎖!”,以及如何修復它?

為什麼使用 `sync.WaitGroup` 會導致'致命錯誤:所有 goroutine 都在睡眠 - 死鎖!”,以及如何修復它?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-04 20:52:13337瀏覽

Why Does Using `sync.WaitGroup` Lead to

使用sync.WaitGroup時理解並解決「致命錯誤:所有goroutines都在睡眠- 死鎖」

嘗試使用sync.WaitGroup協調多個goroutines的完成時,可能會遇到錯誤“致命錯誤:所有goroutine 都在睡覺 -死鎖!

此錯誤的根源在於 Go 處理傳遞給函數的值的方式。當直接傳遞一個sync.WaitGroup物件時,Go會建立該值的副本,本質上是將一個不同的物件傳遞給每個goroutine。這會在原始 WaitGroup 和 goroutine 所操作的副本之間造成脫節。

此問題的解決方案是將指標傳遞給sync.WaitGroup。透過這樣做,所有 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() {
    wg := &sync.WaitGroup{} // Use pointer to pass the WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go doWork(wg)
    }
}

透過此更改,goroutine 將與 WaitGroup 物件正確交互,在開始工作之前遞增其計數器,並在完成後遞減計數器。因此,主函數中的 WaitGroup.Wait() 呼叫不會無限期地阻塞,程式將如預期執行。

以上是為什麼使用 `sync.WaitGroup` 會導致'致命錯誤:所有 goroutine 都在睡眠 - 死鎖!”,以及如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn