Какая разница между использованием пула потоков и нормальным потоком?

Я читал случайные вопросы и ответы здесь на SO и наткнулся на этот вопрос:

С#, IAsyncResult и пул потоков

Вопрос задается методом X с использованием пула потоков или использованием обычных потоков.

Какая разница между использованием пула потоков и обычного потока?

Ответы

Ответ 1

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

Для длительных задач лучше использовать созданный вручную поток, а его фоновое свойство равно true.

Примечание. В версии .NET Framework версии 2.0 значение свойства Thread.CurrentPrincipal передается в рабочие потоки, помещенные в очередь с использованием метода QueueUserWorkItem. В более ранних версиях основная информация не распространяется.

Когда не использовать потоки пула потоков

Существует несколько сценариев, в которых целесообразно создавать и управлять своими потоками вместо потоков потоков потоков:

  • Вам нужен поток переднего плана (!).

  • Для потока требуется определенный приоритет.

  • У вас есть задачи, которые заставляют поток блокироваться в течение длительных периодов времени. Пул потоков имеет максимальное количество потоков, поэтому большое количество заблокированных потоков пула потоков может помешать запуску задач.

  • Вам нужно поместить потоки в однопоточную квартиру. Все потоки ThreadPool находятся в многопоточной квартире.

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

Одно большое отличие заключается в том, что Необработанные исключения в потоках пула потоков завершают процесс; с этими тремя исключениями:

  • A ThreadAbortException выбрасывается в поток пула потоков, потому что был вызван Abort.

  • В поток потока пула добавляется AppDomainUnloadedException, потому что домен приложения выгружается.

  • Среда выполнения общего языка или хост-процесс завершают поток.

Некоторые хорошие ссылки:

Пул управляемых потоков

Threading in С#

Программирование пула потоков в .NET Framework

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

Ответ 2

Разница не между самими нитями, поскольку они будут вести себя одинаково, разница в том, кто управляет временем жизни потока и как вы их используете.

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

Это хорошо, но недостатком этого является ограниченное количество потоков, доступных в потоковом пуле, поэтому, если вы ставите в очередь длинную задачу, это может оказать негативное влияние на ваше приложение, поскольку вы можете использовать threadpool нить, которую что-то еще может использовать.

Смотрите статью о пуле потоков

Ответ 3

В ThreadPool имеется ряд потоков, которые готовы к использованию, что может исключить затраты на создание новых потоков, что и происходит при создании нормального потока.

Ответ 4

Threadpool создает потоки, а assigsn работает с бесплатным потоком. Таким образом, создание и удаление потоков для каждого рабочего элемента предотвращается, поскольку создание и удаление потоков - это относительно дорогостоящая операция.