次の go プログラムでデッドロック エラー「致命的エラー: すべてのゴルーチンがスリープ中です - デッドロック!」が発生するのはなぜですか?

PHPz
リリース: 2024-02-09 08:00:11
転載
448 人が閲覧しました

为什么下面的 go 程序会出现死锁错误“致命错误:所有 goroutine 都在睡眠 - 死锁!”

Go 言語では、デッドロックは一般的なエラーであり、すべてのゴルーチンがスリープしている場合、「致命的なエラー: すべてのゴルーチンがスリープしています。 - デッドロック!」という致命的なエラーが発生します。この状況は通常、複数のゴルーチンが相互に待機しているときに発生します。あるゴルーチンが別のゴルーチンの操作の完了を待機し、別のゴルーチンが最初のゴルーチンの操作の完了を待機すると、デッドロックが発生します。この場合、すべてのゴルーチンが実行を続行できないため、プログラムは実行を続行できません。デッドロック エラーを回避するには、ゴルーチン間の依存関係を慎重に設計および管理し、それらが正しく連携できるようにする必要があります。

質問内容

私は golang を初めて使用しており、チャネルの典型的なプロデューサー コンシューマーをいくつか使用しようとしています。プロデューサーとコンシューマーの両方が同じチャネルから書き込みと読み取りを行う必要があることを理解しています。ただし、実験のため、以下に示すように、異なるチャネルから書き込みと読み取りを行うようにしました。 リーリー

プログラムを実行すると、次のエラーが表示されます。

リーリー

さて、両方のゴルーチンがブロックされていることがわかりましたが、1 つはチャネル 1 への読み取り呼び出しで、もう 1 つはチャネルへの書き込み呼び出しでブロックされているため、プログラムは決して終了しません。 しかし、私の質問は、プログラムが実際にこれらのチャネルの値を待っている場合、プログラムはデッドロックを宣言するのではなく、無限に待機すべきではないのかということです。後でネットワークの読み取り/書き込みにより値が到着し、他の Go ルーチンがこれらのチャネルに書き込む場合はどうなるでしょうか?

解決策

実行中のプログラムは、すべてのゴルーチンが同期プリミティブでブロックされている場合にのみ、デッドロック パニックによって終了します。すべての goroutine がチャネル操作やミューテックス ロックの待機中にブロックされている場合、どの goroutine もネットワーク接続をリッスンしていないため、ネットワーク受信はできません。これは、多くのゴルーチンを含むプログラムでは、デッドロックされたゴルーチンのグループが多数存在する可能性がありますが、実行を継続できる他のゴルーチンがあるため、プログラムは引き続き実行されることも意味します。

以上が次の go プログラムでデッドロック エラー「致命的エラー: すべてのゴルーチンがスリープ中です - デッドロック!」が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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