我的应用程序在捕获线程中捕获网络数据包(如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);
}每个线程可能只运行几毫秒,但根据回调方法可以运行更长时间。每次捕获数据包时都会启动它们,这是非常频繁的。
我现在的问题是:启动一个新线程的开销有多大?与其以高频率创建新线程,不如使用一个不断运行的线程池吗?如果我的回调速度慢,这可能导致在旧线程仍在运行时启动许多新线程,因此我需要池中的大量线程,因此可能需要一个动态增长的池。但是,如果流量减少或高负载订阅者取消订阅,则可能导致许多空闲线程。你有什么建议?
发布于 2013-09-27 08:31:12
我会使用.NET的ThreadPool。不要担心需要更多的线程,或者需要杀死无用的空闲线程: ThreadPool使用爬山启发式来确定线程的最佳数量,以达到最大的性能。
在这里了解更多关于ThreadPool如何工作的内容:http://msdn.microsoft.com/en-us/magazine/ff960958.aspx
https://stackoverflow.com/questions/19045994
复制相似问题