1

以前のプロジェクトでコマンドパターンがどのように使用されたかを見て、コマンドは異なるスレッドで実行できるため、マルチスレッド(並列)プログラミングでどのように役立つかを理解できます。コマンド間でデータを渡す必要がある場合は、データを共有メモリに格納し、そのデータへのポインタ(またはハンドル)を別のスレッドの呼び出し元に渡すことができます。

ただし、デコレータパターンには、すべてが単一のスレッドで発生する必要があるという制限があるようです。これは、デコレータがデリゲートを直接呼び出す必要があるため、同じスレッド上にある必要があることを意味します。

この制限についての私の理解は正しいですか?それどころか、複数のスレッドでデコレータを実行することは可能ですか?


私が実装しようとしているのは、データのストリームを処理するパイプラインです。

  • コマンドパターンとして実装するには、そのexecuteメソッドは2つの引数を取ります。入力用のバッファーと出力用のバッファーです。
  • デコレータパターンとして実装するために、そのgetdataメソッドはデリゲートを呼び出して前のステップの結果を取得し、独自の処理を適用して、結果を呼び出し元に返します。

しかし、両方のスタイルで実装した後、それぞれに元々明確ではなかった制限があることがわかりました。

  • コマンドパターンを使用すると、新しいバッファーを使用してより多くの入力データの受け入れを開始できますが、以前のバッファーは、別々のワークスレッドで実行されているいくつかのコマンドによって処理されます。デコレータパターンではこれができないようです。
  • デコレータパターンを使用する場合、デコレータはデリゲートに対して任意の数の呼び出しを行い、結果を1つのチャンクに結合することができます。また、1つの大きなリクエストを作成してキャッシュし、その一部を返すことで、データを分割することもできます。1つの入力バッファと1つの出力バッファでコマンドパターンを使用する場合、結果の組み合わせや分割はできません。
4

1 に答える 1

2

どのスレッドでもデコレータを実行できるかどうかは、実装によって定義されます:)

デコレータがスレッドセーフの場合...はい。そうでない場合:同期を追加します。これにより、パフォーマンスが低下する可能性があります。

ただし、私の見解では、デコレータがデコレーションしているオブジェクトにほとんど専念し、それ以外のコンテキスト/状態はごくわずかであることが非常に理にかなっています。ここで装飾されているオブジェクトは、そもそもスレッドセーフ(または認識)である必要があります。そうしないと、デコレータがなくても同じ問題が発生します。

おそらく、これはあなたが「軽量」デコレータと呼ぶものです。デコレータが重い場合(「世界を使って」仕事をするという点で)、同期が必要になることは間違いありません。これは、パフォーマンスのボトルネックにつながる可能性もあります。

しかし、基本的 に、(一般的に)デコレータが必要なスレッドで実行されることを妨げるものは何もありません

于 2011-05-21T23:18:07.903 に答える