Я вижу это в книге "CLR через C#" и не улавливаю. Если в пуле потоков все еще есть потоки, почему он создает дополнительные потоки?
[CLR Threading] Когда поток пула потоков блокируется, пул потоков создает дополнительные потоки.
Ответы (2)
Это может быть просто неудачная формулировка.
На данной машине пул потоков имеет хорошее представление об оптимальном количестве потоков, которые машина может запустить без чрезмерного расширения ресурсов. Если по какой-либо причине поток блокируется по вводу-выводу (например, он долго ожидает сохранения или извлечения данных с диска или ответа от сетевого устройства), пул потоков может запустить другой поток, чтобы воспользоваться неиспользуемым ЦП. время. Когда другой поток больше не блокируется, пул потоков возьмет следующий освобожденный поток из пула, чтобы уменьшить размер до «оптимального» уровня.
Это часть управления пулом потоков, чтобы предотвратить перегрузку системы (и снижение эффективности из-за всех переключений контекста между слишком большим количеством потоков) при одновременном сокращении потерянных циклов (пока поток заблокирован, может не хватить другой работы для выполнения задачи процессор (ы) полностью, даже если есть задачи, ожидающие выполнения) и потраченная впустую память (потоки запущены и готовы, но никогда не распределяются, потому что они перегружают ЦП).
Дополнительные сведения об управляемом пуле потоков из MSDN.
Книга лгала.
Threadpool создает дополнительные потоки только в том случае, если все доступные потоки были заблокированы более чем на 1 секунду. Если есть свободные потоки, он будет использовать их для обработки ваших дополнительных задач. Обратите внимание, что через 30 секунд бездействия потока CLR удаляет поток (завершает его, разумеется, изящно).