【问题标题】:Thread pool for fast bursts of short threads?用于快速突发短线程的线程池?
【发布时间】:2013-09-27 16:31:12
【问题描述】:

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

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

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

【问题讨论】:

  • Paralell.ForParalell.ForEach 仅用于此目的(如果您的任务不满足)
  • @dcastro 那么问题是什么?为什么不分派所有并将其添加到单个线程中的临时集合中,然后使用临时集合执行Paralell.ForEach。我错过了什么吗?
  • 他似乎不想等待这些线程完成,因此不需要临时收集。他似乎在寻找一种“一劳永逸”的方法。当所有任务结束时,Paralell.ForEach 结束。
  • 感谢您的建议,但我无法使用 Paralell.ForEach,因为我使用的框架是绑定到 .Net 3.5。

标签: c# multithreading threadpool


【解决方案1】:

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

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

【讨论】:

  • ThreadPool 如果您将 1000 个任务排队,将会死掉。任何其他排队的任务都会因此受到影响。 :(
  • 你说的“死”是什么意思?根据我的研究,您可以排队的工作项似乎没有限制:stackoverflow.com/questions/2095805/…
  • 队列没有限制,我的意思是它会表现不佳注意我的第二点任何其他排队的任务都会因此受到影响。这就是我的意思
  • 当然TPL 在内部使用ThreadPool。但主要区别在于他们在正确的时间安排对线程池的调用
  • 据我所知,ParallelThreadPool 调度之间的唯一性能差异是Parallel.ForEach 为您的工作项集合进行智能分区。如果他有数百个订阅者,这将是相关的,并且他想在这些订阅者之间分配工作。在这种情况下,问题在于接收的数据包数量,而不是订阅者数量,所以他不能使用智能分区来划分他的工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
相关资源
最近更新 更多