同時 Go ルーチンを操作する場合、デッドロックを回避するには同期の処理が重要です。このようなシナリオの 1 つは、複数の goroutine を調整し、sync.WaitGroup を使用してそれらの完了を待機しようとしたときに発生します。ただし、場合によっては、「致命的なエラー: すべてのゴルーチンがスリープ状態です - デッドロック!」というエラーが発生することがあります。
このエラーは、sync.WaitGroup の誤った使用法が原因で発生します。提供されたコード スニペット:
import "sync" func doWork(wg sync.WaitGroup) error { defer wg.Done() // Do some heavy lifting... request URL's or similar return nil } func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go doWork(wg) } wg.Wait() }
問題は、sync.WaitGroup オブジェクトを doWork 関数に直接渡すことにあります。値を値渡しすると、オブジェクトのコピーが作成され、予期しない動作が発生します。
修正には、代わりに sync.WaitGroup へのポインタを渡すことが含まれます。
import "sync" func doWork(wg *sync.WaitGroup) error { defer wg.Done() // Do some heavy lifting... request URL's or similar return nil } func main() { wg := &sync.WaitGroup{} for i := 0; i < 10; i++ { wg.Add(1) go doWork(wg) } wg.Wait() }
Byポインタを渡すと、各ゴルーチンは同じ WaitGroup オブジェクトを参照し、目的のインスタンスで Done() が呼び出されることを保証します。これにより、デッドロックの問題が解決され、プログラムがエラーなしで実行できるようになります。
sync.WaitGroup を使用してゴルーチンを同期する場合は、常にオブジェクトへのポインタを渡して一貫した動作を確保し、潜在的なデッドロックを回避することに注意してください。
以上がGo の sync.WaitGroup を使用するときにデッドロックを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。