Подтвердить что ты не робот

Сон в объединенной нитке С#

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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