Важно понимать, как работает планировщик потока. Он был разработан для точной настройки количества потоков , работающих под потоками против возможностей вашей машины. Возможно, ваш компьютер может работать только с двумя потоками одновременно, двухъядерные процессоры являются текущим стандартом. Может, четыре.
Итак, когда вы сбрасываете кучу нитей на коленях, он начинается с активации только двух потоков. Остальные из них находятся в очереди, ожидая появления ядер процессора. Как только один из этих двух потоков завершается, он активирует другой. Дважды в секунду он оценивает, что происходит с активными потоками, которые не были завершены. Это делает грубое предположение, что эти потоки блокируются и, таким образом, не достигают прогресса и позволяют активировать другой поток. Теперь у вас есть три работающих потока. Получение 500 потоков, максимальное количество потоков по умолчанию будет занимать 249 секунд.
Очевидно, что это поведение говорит о том, что должен делать поток, подходящий для работы в потоке потока. Он должен завершиться быстро и не блокировать часто. Обратите внимание, что блокирование запросов ввода-вывода рассматривается отдельно.
Если это поведение вас не устраивает, вы можете использовать обычный поток. Он сразу начнет работать и конкурировать с другими потоками в вашей программе (и операционной системе) для процессорного времени. Создание 30 000 таких потоков невозможно, для этого недостаточно виртуальной памяти. 32-разрядная операционная система скрывается где-то к югу от 2000 потоков, потребляя всю доступную виртуальную память.Вы можете получить около 50 000 потоков в 64-разрядной операционной системе до того, как файл подкачки закончится. Тестирование этих ограничений в производственной программе не рекомендуется.
Да, я узнал, что у моей машины четыре ядра. w/o threadpool мое приложение работает в 4 раза медленнее. –