3

私は現在、並行プログラミングパターンを研究しています。ウィキペディアに掲載されている、セマフォを使用した制限付きバッファーによる生産者/消費者問題の解決策を検討してください。

ある時点で、プロデューサーが次のように言った場合はどうなりますか。これが私が作成する最後のアイテムです。プログラムを終了させるにはどうすればよいですか?(バッファに何かがあることが通知されるまで、コンシューマは待機します)。

同様に、消費者が「もう消費したくない」と言ったらどうなるでしょう。プログラムが終了するように、プロデューサーにどのように通知できますか?(プロデューサーは何かを置くための利用可能な場所があるのを待っています)。

4

2 に答える 2

4

実践書7.2.3のJava並行性から

Another way to convince a producer consumer service to shut down is with a poison pill: a recognizable object placed on the queue that means "when you get this, stop."

この本の第7章を通過するCancellation and Shutdown

于 2013-03-21T16:54:24.107 に答える
2

ポイズンメッセージをキューに入れることで、プロデューサーにコンシューマーを終了させることができます。コンシューマーがメッセージを受信すると、メッセージがプロデューサーからのシャットダウンであると認識し、それに応じてシャットダウンします。

与えられたシナリオでの消費者から生産者へのコミュニケーションは不可能です。コミュニケーションは現在一方向にすぎないため、別のコミュニケーションチャネルを作成する必要があります。

Exchangerインスタンスを直接(キューなし)通信に使用すると、独立したプロデューサー/コンシューマーペアではなく、直接リンクされたプロセスペアが作成されますが、ポイズンメッセージを双方向に渡すことができます。

最後に、すべてのプロデューサーとコンシューマーを単一のマネージャーに登録し、それらすべてが参照できるようにすることができます。すべてのプロデューサー/コンシューマーは、フラグを設定するシャットダウンを要求してから、すべてのフラグをチェックするか、InterruptedExceptionとmanagerはそれらのそれぞれに割り込みを送信します。

于 2013-03-21T16:55:38.337 に答える