我的应用程序在捕获线程中捕获网络数据包(如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);
}
这些线程中的每一个可能只运行几毫秒,但可以运行更长时间,具体取决于回调方法。每次捕获数据包时都会启动它们,这可能非常频繁。
我现在的问题是:启动一个新线程的开销有多高?使用不断运行的线程池而不是高频创建新线程会更好吗?如果我的回调很慢,这可能会导致在旧线程仍在运行时开始需要许多新线程,所以我需要池中的大量线程,所以我可能需要一个动态增长的池。但是,如果流量减少或高负载订阅者退订,这可能会导致许多空闲线程。你有什么建议?