go WaitGroup的坑
生活随笔
收集整理的這篇文章主要介紹了
go WaitGroup的坑
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
go WaitGroup的使用請參考筆者的另外一篇博客
go WaitGroup的使用示例
這里重點講一下WaitGroup的注意點,以免被坑
示例代碼如下:
package main import ("log""sync" ) func main() {wg := sync.WaitGroup{}for i := 0; i < 5; i++ {wg.Add(1)go func(wg sync.WaitGroup, i int) {log.Printf("i:%d", i)wg.Done()}(wg, i)}wg.Wait()log.Println("exit") }代碼很簡單,主協程中新建5個子協程,每個子協程中打印數字后即結束,調用Done(),按照我們的代碼執行應該是子協程打印參數后,主協程Wait()結束,打印exit,最終結束
但實際上執行結果卻是下面:
竟然出錯了!!!!!
是因為子協程函數的參數sync.WaitGroup,我們傳入的是對象,是wg的新構造的臨時對象,而非指針,所以Done()是在那個新的對象中執行的,而非我們的全局變量wg,所以全局變量wg沒有子線程Done(),一直等待,造成了死鎖
其實代碼寫完后,智能的編譯器已經給出了提示,請看下圖
請看彈框的內容,即sync.WaitGroup是不可拷貝構造的
所以我們把參數由對象改為指針時,即可修復
代碼及執行效果如下:
package main import ("log""sync" ) func main() {wg := sync.WaitGroup{}for i := 0; i < 5; i++ {wg.Add(1)go func(wg *sync.WaitGroup, i int) {log.Printf("i:%d", i)wg.Done()}(&wg, i)}wg.Wait()log.Println("exit") }總結
以上是生活随笔為你收集整理的go WaitGroup的坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: go errgroup 用法示例
- 下一篇: go uintptr unsafe Po