[CLR Threading] Когда поток потоков пула блокируется, пул потоков создает дополнительные потоки - PullRequest
0 голосов
/ 31 октября 2010

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

Ответы [ 2 ]

1 голос
/ 01 ноября 2010

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

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

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

Дополнительная информация о Пуле управляемых потоков из MSDN.

0 голосов
/ 22 декабря 2010

Книга лгала.

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

...