理解「致命錯誤:所有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中文網其他相關文章!