外部関数による 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 に渡すと、同じ WaitGroup インスタンスが操作されることが保証されます。 Print 関数のシグネチャから wg を削除すると、関数が外部の WaitGroup について知る必要がなくなります。
結論:
2 番目の解決策は、次のような問題を回避する、より堅牢なアプローチです。デッドロックを回避し、wg からの Print 関数の独立性を維持します。
以上が外部関数で sync.WaitGroup を使用するときにデッドロックを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。