デッドロック - すべてのゴルーチンがスリープ状態です (待機グループを使用している場合でも)

PHPz
リリース: 2024-02-09 13:40:08
転載
1145 人が閲覧しました

死锁 - 所有 goroutine 都处于睡眠状态(即使使用等待组)

php エディター Xiaoxin は、同時プログラミングの一般的な問題であるデッドロックを紹介します。デッドロックとは、すべてのゴルーチンがスリープ状態になり、待機グループなどのメカニズムが使用されていても実行を続行できないことを意味します。この場合、すべてのゴルーチンが先に進むことができず、プログラムが無限待機状態に陥ります。並行プログラミングでは、デッドロックを回避することが非常に重要であり、プログラムが正常に動作するようにその原因と解決策を理解する必要があります。

質問の内容

私は go の同時実行性を学んでいますが、2 つの go ルーチンがチャネルを通じて更新された値を渡しながら相互に通信を継続したいと考えています。 1 つは 2 を加算し、もう 1 つは 1 を減算します。コードと出力は次のとおりです。

このコードのどこが間違っているのでしょうか?

リーリー

出力:

リーリー

その後、終了します。

ゴルーチンで wg.done() を呼び出さなくても、ゴルーチンは常に値を交換しないのはなぜですか?

解決策

開始した両方のゴルーチンは、1 つの値のみを受信し、1 つの値を送信して終了します。そこからは、main ゴルーチンのみが存在します。これは、wg.done() を呼び出していないため、wg.wait() でブロックされます。

(n 無限) ループを使用するのを忘れました:

リーリー

この変更により、アプリケーションは永久に実行され、出力は次のようになります:

リーリー

以上がデッドロック - すべてのゴルーチンがスリープ状態です (待機グループを使用している場合でも)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート