2

我的应用程序在捕获线程中捕获网络数据包(如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);
}

这些线程中的每一个可能只运行几毫秒,但可以运行更长时间,具体取决于回调方法。每次捕获数据包时都会启动它们,这可能非常频繁。

我现在的问题是:启动一个新线程的开销有多高?使用不断运行的线程池而不是高频创建新线程会更好吗?如果我的回调很慢,这可能会导致在旧线程仍在运行时开始需要许多新线程,所以我需要池中的大量线程,所以我可能需要一个动态增长的池。但是,如果流量减少或高负载订阅者退订,这可能会导致许多空闲线程。你有什么建议?

4

1 回答 1

1

我会使用 .NET 的ThreadPool. 不必担心需要更多线程,或者需要杀死无用的空闲线程:ThreadPool 使用 Hill-Climbing 启发式计算最佳线程数以实现最大性能。

在此处阅读有关 ThreadPool 工作原理的更多信息:http: //msdn.microsoft.com/en-us/magazine/ff960958.aspx

于 2013-09-27T08:31:12.073 回答