外部関数で sync.WaitGroup を使用するためのベスト プラクティス
提供されたコード スニペットでは、同期を利用しようとするとデッドロックが発生します。 .WaitGroup と外部関数。このエラーは、WaitGroup のコピーを外部関数に誤って渡し、目的の WaitGroup で Done() メソッドが呼び出されないことが原因で発生します。
この問題に対処するには、必ず、代わりに WaitGroup を使用してください。これにより、外部関数は正しい WaitGroup にアクセスし、Done() を適切に呼び出すことができます。修正されたコードは次のとおりです。
<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) // Pass a pointer to the WaitGroup go func() { for i := 1; i <= 11; i++ { ch <- i } close(ch) defer wg.Done() }() wg.Wait() // Wait for both goroutines to finish } func Print(ch <-chan int, wg *sync.WaitGroup) { for n := range ch { // Read from the channel until it's closed fmt.Println(n) } defer wg.Done() }</code>
また、以下に示すように、Print 関数のシグネチャを変更して WaitGroup パラメーターを削除することもできます。
<code class="go">func Print(ch <-chan int) { for n := range ch { // Read from the channel until it's closed fmt.Println(n) } }</code>
この場合、Print 関数は関数は、完了時に WaitGroup を閉じる責任があります。このアプローチは、外部関数が WaitGroup に直接アクセスする必要がないシナリオで推奨されます。
以上が外部関数で `sync.WaitGroup` を使用するとデッドロックが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。