0

そのため、イベントが発生し、それを複数のサブスクライブされた「リスナー」に「ブロードキャスト」する必要がある状況があります。

私の現在の設計は、各サブスクライバーのループであり、シリアルに動作し、各「レシーバー」に順番に通知します。

ただし、一部の負荷/ストレステストでは、受信者のリストの#15が通知を受信するまでに長時間待機する可能性があるため、自分が好きな以上にキューに入れることができることがわかりました。

受信者のリストに多かれ少なかれ同時に通知を受信させる方法を提供したいと思います。

ThreadPoolが出ています。その理由については私自身の理由があります。

私の懸念はパフォーマンスです。これが私が考えていることです...

A.イベントが発生するたびに、レシーバー固有の通知を行うために、レシーバーごとに1つのスレッドが作成されます。通知が完了すると、スレッドは終了します。
----または----
B.イベントが最初に発生すると、レシーバーごとにスレッドが作成されますが、これは「無限」のスレッドであり(ループが存続します)、通知の詳細がそれぞれにマーシャリングされます。これらのスレッドのうち、新しいデータを処理します。

したがって、問題は次のとおりです。新しいスレッドを作成する、または既存のスレッドにデータをマーシャリングするのに費用がかかるのでしょうか。それとも同じくらい費用がかかるのであれば、なぜ一方を選択するのでしょうか。

4

2 に答える 2

2

TP スレッドを使用する代わりにスレッドを作成すると、システム リソースと時間の両方で非常にコストがかかります。たとえば、スレッド セーフ キューを介してデータを渡すことは、使用可能なコアを使い果たしていなくて (可能性が非常に高いように思えます)、シグナルを送信した同期オブジェクトで受信スレッドがブロックされている場合に限り、パフォーマンスが向上する可能性があります。典型的なスレッド コンテキスト スイッチのコストは 2000 ~ 10,000 マシン サイクルです。スレッドは同じアドレス空間で実行されるため、おそらく低コストです。

実際のコストは、レースやデッドロックを際限なく追跡することなく、非常に多くのスレッドを正しく実行することの難しさです。

于 2011-03-19T00:43:51.900 に答える
0

あなたのループは忙しい待機の問題を引き起こしませんか? ループの反復のほとんどは、ループ内にあるいくつかのチェックを除いて、生産的なことを何もしないため、CPU サイクルを無駄にします。アイドル状態の CPU を持つことは常に悪いパフォーマンスの選択であるため、おそらく新しいスレッドに固執します。

PS 何らかのリーダー選挙アルゴリズムを実装していますか?

于 2011-03-19T00:45:52.147 に答える