2010-01-10 3 views
0

Я использую функцию QueueUserWorkItem() для вызова threadpool.
И я пробовал много работы с ним. (около 30000)
, но диспетчер задач мое приложение только делает поток 4 ~ 5 после нажатия кнопки запуска.
Я прочитал MSDN, в котором говорилось, что число ограничений по потоку по умолчанию составляет около 500.
Почему только несколько потоков сделаны в моем приложении?
Я использую tyring, чтобы ускорить свое приложение, и я считаю, что этот threadpool является причиной, которая замедляет мое приложение.

My threadspool просто делает 4 ~ 5threads. Зачем?

благодаря

ответ

1

Важно понимать, как работает планировщик потока. Он был разработан для точной настройки количества потоков , работающих под потоками против возможностей вашей машины. Возможно, ваш компьютер может работать только с двумя потоками одновременно, двухъядерные процессоры являются текущим стандартом. Может, четыре.

Итак, когда вы сбрасываете кучу нитей на коленях, он начинается с активации только двух потоков. Остальные из них находятся в очереди, ожидая появления ядер процессора. Как только один из этих двух потоков завершается, он активирует другой. Дважды в секунду он оценивает, что происходит с активными потоками, которые не были завершены. Это делает грубое предположение, что эти потоки блокируются и, таким образом, не достигают прогресса и позволяют активировать другой поток. Теперь у вас есть три работающих потока. Получение 500 потоков, максимальное количество потоков по умолчанию будет занимать 249 секунд.

Очевидно, что это поведение говорит о том, что должен делать поток, подходящий для работы в потоке потока. Он должен завершиться быстро и не блокировать часто. Обратите внимание, что блокирование запросов ввода-вывода рассматривается отдельно.

Если это поведение вас не устраивает, вы можете использовать обычный поток. Он сразу начнет работать и конкурировать с другими потоками в вашей программе (и операционной системе) для процессорного времени. Создание 30 000 таких потоков невозможно, для этого недостаточно виртуальной памяти. 32-разрядная операционная система скрывается где-то к югу от 2000 потоков, потребляя всю доступную виртуальную память.Вы можете получить около 50 000 потоков в 64-разрядной операционной системе до того, как файл подкачки закончится. Тестирование этих ограничений в производственной программе не рекомендуется.

+0

Да, я узнал, что у моей машины четыре ядра. w/o threadpool мое приложение работает в 4 раза медленнее. –

0

ThreadPool находится там, так что вы можете избежать создания потока для каждой асинхронной операции по той причине, что потоки являются дорогостоящими. Если вы хотите 30 000 потоков, вы собираетесь использовать много памяти для стеков потоков и тратить много времени на процессор, используя контекстные переключатели. Теперь создание многих потоков было бы оправдано, если у вас было 30 000 ядер процессора ...

1

Я думаю, что вы, возможно, неправильно поняли использование threadpool. Нервные нити и убивающие потоки связаны с ядром Windows и являются дорогостоящей операцией. Если вы постоянно нуждаетесь в потоках для выполнения асинхронной операции, а затем вы выбрасываете их, они будут выполнять множество системных вызовов.

Таким образом, threadpool на самом деле представляет собой группу потоков, которые создаются один раз, которые вместо того, чтобы выйти, когда они завершают свою задачу, фактически ожидают другого элемента для queueuserworkitem. Затем threadpool настроится на то, сколько потоков требуется одновременно для вашего процесса. Если вы хотите проверить это, напишите этот код:

for(int i = 0; i < 30000; i++) 
{ 
    ThreadPool.QueueUserWorkItem(myMethod); 
} 

Вы увидите, что это создаст целую кучу нитей. Возможно, не 30000, поскольку некоторые из создаваемых потоков будут повторно использоваться, когда ThreadPool начнет работать через ваши вызовы функций.

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