2013-09-27 21 views
1

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

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

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

+0

'Paralell.For'和'Paralell.ForEach'是专为这一目的只(如果你的任务不是满足) –

+0

@dcastro那么,有什么问题呢?为什么不分发所有内容并将其添加到单个线程的临时集合中,然后使用temp集合执行'Paralell.ForEach'。我在误解什么? –

+0

他似乎不想等待这些线程完成,因此不需要临时集合。他似乎在寻找一种“忘却”的方法。当所有任务结束时,“Paralell.ForEach”结束。 – dcastro

回答

1

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

了解更多关于线程池的工作原理在这里:http://msdn.microsoft.com/en-us/magazine/ff960958.aspx

+1

如果您排列1000个任务,'ThreadPool'将会死亡。排队的任何其他任务将因此受到影响。 :( –

+0

你是什么意思的“死”?从我研究,似乎没有限制你可以排队多少工作项:http://stackoverflow.com/questions/2095805/maximum-queued-elements -in-threadpool-queueuserworkitem – dcastro

+1

对队列没有限制,我的意思是它会执行差的注释我的第二点**任何排队的其他任务将受到影响,这是因为这是我的意思 –