Мой пул потоков просто делает 4 ~ 5 потоков. Зачем? - PullRequest
0 голосов
/ 10 января 2010

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

спасибо

Ответы [ 3 ]

1 голос
/ 10 января 2010

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

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

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

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

1 голос
/ 10 января 2010

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

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

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

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

0 голосов
/ 10 января 2010

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

...