Когда ThreadPool создает новые потоки, а не использует их повторно?

1

Я прочитал следующий абзац в следующем ответе Рида Копси:

Будут ли значения в переменных ThreadStatic по-прежнему присутствовать при циклическом переходе через ThreadPool?

Пул потоков (по дизайну) поддерживает потоки между вызовами. Это означает, что переменные ThreadStatic будут сохраняться между вызовами QueueUserWorkItem.

Это поведение тоже не стоит рассчитывать. ThreadPool (в конце концов, по своему усмотрению) отменит потоки и вернет их, и при необходимости создаст новые потоки.

В каких условиях threadpool в конечном итоге создает новые потоки вместо повторного использования?

Теги:
multithreading
threadpool

2 ответа

1
Лучший ответ

AFAIK в условиях "недокументированных".

В первую очередь следует учитывать, что существует как минимум 4 часто используемых хостинг-провайдера CLR (ASP.Net, IE, shell exes и SQLCLR), и каждый из них имеет свои собственные политики. Например, хост SQLCLR использует собственную архитектуру потоков и задач SQL Server и реагирует на сигналы сигнализации о давлении посредством сокращения пулов (всевозможные пулы, включая потоки).

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

2

Как сказал Адриано, это детали реализации, о которых вы не должны беспокоиться. Но, ради любопытства, это лучшее объяснение того, как работает ThreadPool, который я мог найти (от Throttling Concurrency в CLR 4.0 ThreadPool):

Чтобы преодолеть некоторые ограничения предыдущих реализаций, в CLR 4.0 были введены новые идеи. Первой методологией, рассмотренной в области теории управления, был алгоритм Hill Climbing (HC). Этот метод представляет собой подход автоматической настройки, основанный на контуре обратной связи ввода-вывода. Выход системы контролируется и измеряется с небольшими временными интервалами, чтобы узнать, что влияет на управляемый вход, и эта информация возвращается в алгоритм для дальнейшей настройки входа. Рассматривая ввод и вывод в качестве переменных, система моделируется как функция в терминах этих переменных.

Проще говоря, алгоритм Hill Climbing,

  1. Измеряет выход с использованием текущего количества потоков (n).
  2. Добавляет поток +1 в пул
  3. Измеряет выход с использованием текущего количества потоков (n +1).
  4. Если O (n +1)> O (n)
    1. вернитесь к шагу 1;
    2. else, вернитесь к шагу 1, но на этот раз выпустите поток на шаге 3 вместо создания нового.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню