Спать в пуле C # поток - PullRequest
13 голосов
/ 10 июня 2011

В этом веб-учебнике по многопоточности в C # Джозеф Альбахари пишет: «Не засыпайте в объединенных потоках!»Почему бы тебе не сделать это?Насколько это может повлиять на производительность?(Дело не в том, что я хочу это делать; мне просто любопытно.)

Ответы [ 3 ]

13 голосов
/ 10 июня 2011

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

Таким образом, сон в потоке пула потоков приводит к истощению пула, который может в конечном итоге исчерпать доступные потоки и не сможет обработать задачи, которые вы ему назначаете.

6 голосов
/ 10 июня 2011

Пул потоков предназначен для быстрого выполнения относительно короткой задачи в другом потоке без затрат на создание нового потока.Пул потоков имеет максимальное количество потоков, и после его достижения задачи помещаются в очередь до тех пор, пока поток не станет доступным.

Поэтому поток, спящий в пуле потоков, будет удерживать очередь или вносить вклад в пул потоков.истощение.

5 голосов
/ 10 июня 2011

Поток является тяжелым объектом.
Создание нового потока требует большого количества ресурсов, таких как выделение 1 МБ для управляемого стека, создание объекта управляемого потока, стека ядра, объекта потока ядрапользовательский поток среды блока.Все это требует времени и памяти.Поэтому вы не хотите создавать и уничтожать объекты очень быстро.Более того, если у вас есть более одного потока, переключение контекста также потребует некоторых ресурсов

Пул потоков - это место, где CLR может помещать неиспользуемые потоки, если ваше приложение нуждается в этом.
Threadpool изначально содержит 0 потоков, после того как вы запросите поток из пула, пул быстро создаст минимальное количество потоков, определенное для пула.Примерно через 2 минуты неиспользованные темы будут убиты.Но если нагрузка увеличивается и вам нужно больше потоков, пул потоков будет медленно создавать новые потоки, пока не будет достигнут максимальный предел.Вы не можете иметь больше потоков, чем максимум, все новые запросы будут поставлены в очередь и выполнены, как только рабочий поток вернется в пул.В худшем случае вы можете получить OutOfMemoryException

Если поток, взятый из пула, заблокирован, он:

  • Содержит ресурсы
  • Не выполняет никакой ценной работы, в то время как приложению может понадобиться этот поток для нового запроса
  • Нарушает масштабируемость, вводя блоки
...