私のアプリケーションは、キャプチャ スレッドでネットワーク パケット (wireshark など) をキャプチャし、他のコンポーネントがコールバック関数をフィルタ条件付きでキャプチャされたパケットに登録できるようにします。現時点では、次のようなパケットをキャプチャするたびに、コールバック サブスクライバーごとにスレッドを開始します。
foreach (CCallbackFilterCondition hCallback in m_ahSubscribers)
{
// Raise callbacks in separate threads so they don't block the capture thread
ParameterizedThreadStart hPTS = new ParameterizedThreadStart(hCallback.raiseIfMeetsConditions);
Thread hCallbackThread = new Thread(hPTS);
hCallbackThread.Start(hPacket);
}
これらの各スレッドはおそらく数ミリ秒しか実行されませんが、コールバック メソッドによってはさらに長く実行される可能性があります。これらは、パケットがキャプチャされるたびに開始されますが、これは非常に頻繁に発生する可能性があります。
私の質問は次のとおりです。新しいスレッドを開始するオーバーヘッドはどのくらいですか? 頻繁に新しいスレッドを作成するのではなく、常に実行されているスレッドのプールを使用する方がよいでしょうか? コールバックが遅いと、古いスレッドがまだ実行されている間に多くの新しいスレッドが必要になる可能性があるため、プールに大量のスレッドが必要になるため、動的に成長するプールが必要になる可能性があります。しかし、トラフィックがダウンしたり、高負荷のサブスクライバーがサブスクライブを解除したりすると、多くのアイドル スレッドが発生する可能性があります。あなたの提案は何ですか?