C++ アプリケーションの DOM でクライアントが何百もの特定の種類のオブジェクト「Foo」を作成しているというパフォーマンスの問題があります。各 Foo インスタンスには、独自のスレッドを持つ独自の非同期作業キューがあります。明らかに、それはスケーリングしません。
ワーク キュー間でスレッドを共有する必要がありますが、車輪の再発明はしたくありません。XP をサポートする必要があるため、Vista/Win7 スレッド プールを使用できません。各キュー アイテムを処理するために必要な作業には、マルチスレッド COM アパートメントでの COM 呼び出しの作成が含まれます。XP スレッド プールのドキュメントには、スレッド ワーカー関数のコールバックで MTA アパートメントを使用して CoInitializeEx() を呼び出しても問題ないと書かれています。テストアプリを作成し、これが機能することを確認しました。WorkItem コールバック関数で CoInitializeEx/CoUninitialize ペアを使用する場合と使用しない場合で、アプリを 100 万回反復実行させました。CoInit* 呼び出しで 35 秒、呼び出しなしで 5 秒かかります。これは、私のアプリケーションにとってオーバーヘッドが多すぎます。スレッド プールはプロセスごとであり、サード パーティのコードは自分のプロセスで実行されるため、そうではないと想定しています。
以上のことから、Win32 スレッド プールを使用する方法はありますか? 何か足りないのでしょうか、それとも XP スレッド プールは高パフォーマンスの COM アプリケーションには役に立たないのでしょうか? 独自のスレッド共有システムを作成する必要がありますか?