当前位置: 首页 > 知识库问答 >
问题:

用于快速爆发短线程的线程池?

袁奇文
2023-03-14

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

这些线程中的每一个可能只运行几毫秒,但根据回调方法的不同,可以运行更长的时间。它们在每次捕获数据包时启动,这可能非常频繁。

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

共有1个答案

寿嘉悦
2023-03-14

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

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

 类似资料:
  • 本文向大家介绍Linux多线程编程快速入门,包括了Linux多线程编程快速入门的使用技巧和注意事项,需要的朋友参考一下 本文主要对Linux下的多线程进行一个入门的介绍,虽然是入门,但是十分详细,希望大家通过本文所述,对Linux多线程编程的概念有一定的了解。具体如下。 1 线程基本知识 进程是资源管理的基本单元,而线程是系统调度的基本单元,线程是操作系统能够进行调度运算的最小单位,它被包含在进程

  • 问题内容: 我想检查多线程是否比单线程快,然后在这里进行演示: 首先我用两个sum方法运行singleThreadStart,结果是 然后我运行secondThreadStart,结果是 然后我用五和方法运行singleThreadStart,结果是 最后我运行FiveThreadStart,结果是 我的问题是: SecondThreadStart比singleThreadStart花费更多的时间

  • 我想检查多线程是否比单线程快,然后我在这里做一个演示: 首先,我用二和方法运行singleThreadStart,结果是 然后我运行第二个ThreadStart,结果是 然后我用五和方法运行singleThreadStart,结果是 最后我运行fiveThreadStart,结果是 我的问题是: SecondThreadStart比singleThreadStart花费更多的时间,是因为创建线程的

  • 我有多个线程从同一队列中写入和读取。我正在使用ConcurrentLinkedQueue。任何线程都可以向队列中添加元素,任何其他线程都可以轮询元素并对其进行处理。我的问题是,如果队列是空的,我想让在队列上轮询的线程等待,直到其他线程将某个元素添加到队列中,如果所有线程都在等待,那么整个进程都应该退出,即不再有线程在写。我用它列出一个目录及其子目录中的所有文件#更快地扫描。 以下是代码片段1: {

  • 本文向大家介绍快速了解Boost.Asio 的多线程模型,包括了快速了解Boost.Asio 的多线程模型的使用技巧和注意事项,需要的朋友参考一下 Boost.Asio 有两种支持多线程的方式,第一种方式比较简单:在多线程的场景下,每个线程都持有一个io_service,并且每个线程都调用各自的io_service的run()方法。   另一种支持多线程的方式:全局只分配一个io_service,

  • 你好,我是多线程编程的新手。我正在尝试创建一个代码来创建一个线程THREAD1,在它完成某些事情后,它会触发另外两个线程,例如THREAD2和THREAD3,然后退出。 我写了两个可能的解决方案。 1) 使用条件变量(不起作用:在某些情况下会出现死锁): 2) THREAD1直接创建另外两个线程。 我想知道你的意见。非常感谢你