ホームページ  >  記事  >  バックエンド開発  >  golang でのマージソートの再帰的/並列実装でデッドロックが発生する

golang でのマージソートの再帰的/並列実装でデッドロックが発生する

WBOY
WBOY転載
2024-02-10 13:15:08437ブラウズ

golang 中合并排序的递归/并行实现中出现死锁

php エディタの Xigua は、golang でマージ ソートの再帰または並列実装を使用すると、デッドロックの問題が発生する可能性があることを発見しました。マージ ソートは一般的に使用される並べ替えアルゴリズムであり、大きな配列を並べ替えのために複数の小さな配列に効果的に分割し、それらを結合することができます。ただし、Golang での並行プログラミングでは、ゴルーチン間の同期制御に注意しないとデッドロックが発生する可能性があります。この記事では、この問題を詳しく調査し、解決策を提供します。

質問内容

Golangの同時実行性についてもっと学ぼうとしているので、同時ソートを行うためにMergeSortアルゴリズムを改良しようとしています。

私のアイデアは、配列が 2 つに分割されるたびに goroutine を作成することなので、コードは次のようになります:

リーリー

しかし、致命的なエラーが発生しました:

リーリー

私は何を間違えたのでしょうか?

回避策

2 つの同時実行モードを混合しているため、少し混乱する可能性があります。もうすぐ到着します。

バッファリングされていないチャネルを使用する場合、送信側のゴルーチンは、受信側のゴルーチンが値を受信する準備ができるまでブロックされます。 この場合、メインのゴルーチンは 2 つのゴルーチンが wg.Wait() の使用を完了するのを待っていますが、2 つのゴルーチンは結果をチャネル ownedLeft と ## に送信しようとしています。 # 注文した通りです。ただし、メインのゴルーチンはチャネルからこれらの値を積極的に受信していないため、ゴルーチンはブロックされ、完了まで続行できません。

この問題は、チャネルをバッファリングすることで簡単に解決できます:

ownedRight := make(chan []int, 1)

ただし、チャネルまたは waitGroups を混合する代わりに使用することもできます。この場合はその必要はありません。

リーリー

以上がgolang でのマージソートの再帰的/並列実装でデッドロックが発生するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。