WaitGroup 同期のための wg.Add() の配置の修正
Go では、sync.WaitGroup 型によってゴルーチン間の同期が提供されます。その主な目的は、メイン goroutine が goroutine のグループがタスクを完了するのを待機できるようにすることです。ただし、wg.Add() 呼び出しの配置は、適切な同期を確保するために重要です。
間違った例では:
<code class="go">var wg sync.WaitGroup var v int32 = 0 for i := 0; i < 100; i++ { go func() { wg.Add(1) // Wrong place atomic.AddInt32(&v, 1) wg.Done() }() } wg.Wait() fmt.Println(v)</code>
wg.Add(1) 呼び出しは、匿名関数ですが、これは間違いです。この誤った配置により、同じゴルーチン内で wg.Done() の後に wg.Add(1) が実行されるため、wg.Wait() が途中で戻る状況が発生する可能性があります。その結果、v は完了したタスクの数を正確に反映せず、その値は 100 未満になる可能性があります。
修正された例では、
<code class="go">var wg sync.WaitGroup var v int32 = 0 for i := 0; i < 100; i++ { wg.Add(1) go func() { atomic.AddInt32(&v, 1) wg.Done() }() } wg.Wait() fmt.Println(v)</code>
wg.Add( 1) 呼び出しは匿名関数の外側に配置されるようになり、wg.Wait() を呼び出す前に、メインの goroutine が 100 個の goroutine すべてを呼び出し、それらの完了タスクを wg に登録したことを確認します。この正しい配置により、100 個のゴルーチンすべてがタスクを完了するまで wg.Wait() がブロックされ、v.
sync.WaitGroup を使用する一般規則:
sync.WaitGroup を使用して同期を確実に成功させるには、次のガイドラインに従ってください:以上がGo の `sync.WaitGroup` で適切な同期を行うために、`wg.Add()` の配置が重要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。