スレッド モデルの特定の選択は、解決しようとしている問題の性質によって決定される必要があります。このようなアプリケーションのスレッド モデルを設計するための "正しい" アプローチは、必ずしも 1 つではありません。ただし、次の仮定を採用する場合:
- メッセージが頻繁に届く
- メッセージは独立しており、共有リソースに過度に依存していません
- 到着したメッセージにできるだけ早く応答することが望ましい
- 処理アーキテクチャ (つまり、マルチコード/マルチ CPU システム) 全体でアプリを適切にスケーリングする必要がある
- スケーラビリティが重要な設計要件です (例: より多くのメッセージをより高速に)
- スレッド障害に対する回復力 / 長い操作が望ましい
私の経験では、最も効果的なスレッド化アーキテクチャは、スレッド プールを使用することです。すべてのメッセージが 1 つのキューに到着し、複数のスレッドがキューで待機し、到着したメッセージを処理します。スレッド プールの実装は、スレッド分散の 3 つの例すべてをモデル化できます。
#1 シングル スレッドがすべてのメッセージを処理 => スレッド プールが 1 つだけのスレッド
#2 N メッセージ タイプあたりのスレッド => N スレッドのスレッド プール。各スレッドはキューを覗いて適切なメッセージ タイプを見つけます。
#3 すべてのメッセージに複数のスレッド => 複数のスレッドを持つスレッド プール
この設計の利点は、処理環境またはメッセージの負荷に比例してスレッド内のスレッド数をスケーリングできることです。スレッドの数は、発生しているリアルタイムのメッセージ負荷に適応するために、実行時にスケーリングすることもできます。
.NET、C++/STL、Java など、ほとんどのプラットフォームで使用できる優れたスレッド プーリング ライブラリが多数あります。
2 番目の質問については、標準の Windows メッセージ ディスパッチ メカニズムを使用するかどうかです。このメカニズムにはかなりのオーバーヘッドが伴い、実際には、Windows アプリケーションの UI ループを介してメッセージをポンピングすることだけを目的としています。これが解決しようとしている問題でない限り、一般的なメッセージ ディスパッチ ソリューションとして使用しないことをお勧めします。さらに、Windows メッセージが運ぶデータは非常に少なく、オブジェクト ベースのモデルではありません。各 Windows メッセージには、コードと 32 ビットのパラメーターがあります。これは、明確なメッセージング モデルの基礎として十分ではない可能性があります。最後に、Windows メッセージ キューは、キューの飽和、スレッドの枯渇、またはメッセージの再キューイングなどのケースを処理するように設計されていません。これらは、適切なメッセージ キューイング ソリューションを実装する際によく発生するケースです。