php エディター Xiaoxin は、同時プログラミングの一般的な問題であるデッドロックを紹介します。デッドロックとは、すべてのゴルーチンがスリープ状態になり、待機グループなどのメカニズムが使用されていても実行を続行できないことを意味します。この場合、すべてのゴルーチンが先に進むことができず、プログラムが無限待機状態に陥ります。並行プログラミングでは、デッドロックを回避することが非常に重要であり、プログラムが正常に動作するようにその原因と解決策を理解する必要があります。
私は go の同時実行性を学んでいますが、2 つの go ルーチンがチャネルを通じて更新された値を渡しながら相互に通信を継続したいと考えています。 1 つは 2 を加算し、もう 1 つは 1 を減算します。コードと出力は次のとおりです。
このコードのどこが間違っているのでしょうか?
リーリー出力:
リーリーその後、終了します。
ゴルーチンで wg.done() を呼び出さなくても、ゴルーチンは常に値を交換しないのはなぜですか?
開始した両方のゴルーチンは、1 つの値のみを受信し、1 つの値を送信して終了します。そこからは、main
ゴルーチンのみが存在します。これは、wg.done()
を呼び出していないため、wg.wait()
でブロックされます。
(n 無限) ループを使用するのを忘れました:
リーリーこの変更により、アプリケーションは永久に実行され、出力は次のようになります:
リーリー以上がデッドロック - すべてのゴルーチンがスリープ状態です (待機グループを使用している場合でも)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。