Go 言語では、プログラムの同時操作はチャネルを通じて実装されます。チャネルはデータ転送に使用される特別なタイプで、ゴルーチン間のデータ交換と通信を可能にします。ただし、プログラム内で単一のチャネルを操作し、新しいチャネルを導入するときにそれを正しく処理しないと、デッドロックが発生する可能性があります。この記事では、PHP エディターの Xiaoxin が、Go プログラムにおける単一チャネルの作業とデッドロックの問題、およびデッドロックを回避する方法について詳しく説明します。
私は Go チャネルを初めて使用するもので、モック カーネルを構築し、チャネルを介したインタラクションを処理することで Go チャネルを学ぼうとしています。このサンプル プログラムの目的は、複数のプロセス (2) が 単一チャネル を使用してカーネルに メモリ割り当て要求 を同時に送信し、他のプロセスが メモリ解放要求 # を送信するようにすることです。 ## カーネルへの 単一だが別個のチャネル を使用します。 リーリー
割り当てリクエストだけがある場合、プログラムは動作しますが、解放リクエストを導入すると、プログラムはデッドロックに陥ります。このプロセスでは、割り当てリクエストを送信するときに応答キューも作成されることに注意してください。ただし、これは問題の一部ではないため、上の画像には示されていません。
完全な手順は次のとおりです:
リーリー
例外は次のとおりです:リーリー
ご協力いただければ幸いです。###乾杯、###
DD。 回避策2) によると、相手の準備が整うまでブロックの送受信が行われます。ここではバッファされたチャネルによってある程度の許容範囲が提供されますが、バッファがいっぱいになると動作は同じになります。 この問題は、k.rlsMemCh
のユーザーを追加することで解決できます。これについて何も計画していない場合は、チャネルを削除するか、ロジックを使用して一時的にチャネルを空にします。
リーリー
排水は次のようになります:
リーリー
以上がGo プログラムは単一チャネルで動作し、新しいチャネルが導入されるとデッドロックに陥るの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。