[CLR Threading] Когда поток пула потоков блокируется, пул потоков создает дополнительные потоки.

Я вижу это в книге "CLR через C#" и не улавливаю. Если в пуле потоков все еще есть потоки, почему он создает дополнительные потоки?


person Albert    schedule 31.10.2010    source источник


Ответы (2)


Это может быть просто неудачная формулировка.

На данной машине пул потоков имеет хорошее представление об оптимальном количестве потоков, которые машина может запустить без чрезмерного расширения ресурсов. Если по какой-либо причине поток блокируется по вводу-выводу (например, он долго ожидает сохранения или извлечения данных с диска или ответа от сетевого устройства), пул потоков может запустить другой поток, чтобы воспользоваться неиспользуемым ЦП. время. Когда другой поток больше не блокируется, пул потоков возьмет следующий освобожденный поток из пула, чтобы уменьшить размер до «оптимального» уровня.

Это часть управления пулом потоков, чтобы предотвратить перегрузку системы (и снижение эффективности из-за всех переключений контекста между слишком большим количеством потоков) при одновременном сокращении потерянных циклов (пока поток заблокирован, может не хватить другой работы для выполнения задачи процессор (ы) полностью, даже если есть задачи, ожидающие выполнения) и потраченная впустую память (потоки запущены и готовы, но никогда не распределяются, потому что они перегружают ЦП).

Дополнительные сведения об управляемом пуле потоков из MSDN.

person Erik Noren    schedule 01.11.2010
comment
Я тоже долгое время избегал думать о них. Я и раньше просматривал разные вещи, но только поработав с Silverlight, я был вынужден больше об этом думать. Ссылки на службы Silverlight генерируют прокси-классы без синхронных вызовов. Вы должны делать все как события с обратными вызовами. Именно тогда я действительно начал интересоваться нитями и их преимуществами. - person Erik Noren; 03.11.2010

Книга лгала.

Threadpool создает дополнительные потоки только в том случае, если все доступные потоки были заблокированы более чем на 1 секунду. Если есть свободные потоки, он будет использовать их для обработки ваших дополнительных задач. Обратите внимание, что через 30 секунд бездействия потока CLR удаляет поток (завершает его, разумеется, изящно).

person Zach Saw    schedule 22.12.2010