php エディタの Xigua は、golang でマージ ソートの再帰または並列実装を使用すると、デッドロックの問題が発生する可能性があることを発見しました。マージ ソートは一般的に使用される並べ替えアルゴリズムであり、大きな配列を並べ替えのために複数の小さな配列に効果的に分割し、それらを結合することができます。ただし、Golang での並行プログラミングでは、ゴルーチン間の同期制御に注意しないとデッドロックが発生する可能性があります。この記事では、この問題を詳しく調査し、解決策を提供します。
Golangの同時実行性についてもっと学ぼうとしているので、同時ソートを行うためにMergeSortアルゴリズムを改良しようとしています。
私のアイデアは、配列が 2 つに分割されるたびに goroutine を作成することなので、コードは次のようになります:
リーリーしかし、致命的なエラーが発生しました:
リーリー私は何を間違えたのでしょうか?
2 つの同時実行モードを混合しているため、少し混乱する可能性があります。もうすぐ到着します。
バッファリングされていないチャネルを使用する場合、送信側のゴルーチンは、受信側のゴルーチンが値を受信する準備ができるまでブロックされます。
この場合、メインのゴルーチンは 2 つのゴルーチンが wg.Wait()
の使用を完了するのを待っていますが、2 つのゴルーチンは結果をチャネル ownedLeft
と ## に送信しようとしています。 # 注文した通りです。ただし、メインのゴルーチンはチャネルからこれらの値を積極的に受信していないため、ゴルーチンはブロックされ、完了まで続行できません。
ownedRight := make(chan []int, 1)。
リーリー
以上がgolang でのマージソートの再帰的/並列実装でデッドロックが発生するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。