sync.WaitGroup 與外部函數的最佳使用
問題:
問題:實現同步。具有外部函數的 WaitGroup 在嘗試列印數字 1 到 11 時導致死鎖。具體來說,錯誤發生在 wg.Wait() 行。
解決方案1(錯誤方法):設定wg.Add(1) 而不是2 是不正確的解決方案,因為它沒有解決根本問題。
解決方案2(改進的方法):<code class="go">package main import ( "fmt" "sync" ) func main() { ch := make(chan int) var wg sync.WaitGroup wg.Add(2) go Print(ch, &wg) go func() { for i := 1; i <= 11; i++ { ch <- i } close(ch) wg.Done() }() wg.Wait() //deadlock here } func Print(ch <-chan int, wg *sync.WaitGroup) { for n := range ch { // reads from channel until it's closed fmt.Println(n) } wg.Done() }</code>
去掉wg Print 函式簽章中的參數。
說明:將 wg 的位址傳遞給 Print 可確保操作同一個 WaitGroup 實例。從 Print 函數簽章中刪除 wg 消除了函數了解外部 WaitGroup 的需要。
結論:第二種解決方案是一種更穩健的方法,可以避免死鎖並保持 Print 函數與 wg 的獨立性。以上是將sync.WaitGroup與外部函數一起使用時如何避免死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!