2013-09-27 4 views
1

Мое приложение захватывает сетевые пакеты (например, wirehark) в потоке захвата и позволяет другим компонентам регистрировать функции обратного вызова с условиями фильтра для захваченных пакетов. На данный момент я начинаю поток для каждого обратного вызова абонента каждый раз, когда я захватить пакет, как это:Пул потоков для быстрых всплесков коротких потоков?

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» с коллекцией temp. Я что-то пропустил? –

+0

Он, похоже, не хочет ждать окончания этих потоков, поэтому нет необходимости в создании темпа. Кажется, он ищет подход «огонь и забыть». Параметр Paralell.ForEach заканчивается, когда заканчиваются все задачи. – dcastro

ответ

1

Я использовал бы .NET ThreadPool. Не беспокойтесь о необходимости создания дополнительных потоков или необходимости уничтожать бесполезные простаивающие потоки: ThreadPool использует эвристику Hill-Climbing для определения оптимального количества потоков для достижения максимальной производительности.

Узнайте больше о том, как работает ThreadPool здесь: http://msdn.microsoft.com/en-us/magazine/ff960958.aspx

+1

'ThreadPool' умрет, если вы ставите 1000 задач. Из-за этого любая другая задача поставлена ​​в очередь. :( –

+0

Что вы подразумеваете под «die»? Из того, что я исследовал, кажется, нет предела тому, сколько рабочих элементов вы можете поставить в очередь: http://stackoverflow.com/questions/2095805/maximum-queued-elements -in-threadpool-queueuserworkitem – dcastro

+1

Нет очереди в очереди, я имею в виду, что он выполнит плохое примечание, моя вторая точка ** любая другая задача поставлена ​​в очередь из-за этого **. Это то, что я имею в виду –

Смежные вопросы