Почему бы * не * изменить приоритет потока ThreadPool (или Задачи)? - PullRequest
24 голосов
/ 08 апреля 2011

В Интернете и переполнении стека существует множество мест, где не рекомендуется изменять приоритет потока ThreadPool или TPL Task .В частности:

"У вас нет контроля над состоянием и приоритетом потока пула потоков."«Среда выполнения управляет пулом потоков. Вы не можете управлять расписанием потока, а также не можете изменять приоритет потока.»

«Вы не должны изменять Культуру или Приоритет или... из PoolThread. Так же, как вы не красите и не перекрашиваете прокатный автомобиль. "

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

" Каждый поток в ThreadPool выполняется с приоритетом по умолчанию икод для изменения ThreadPriority не имеет никакого эффекта. "

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

Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;

Итак, вопрос в том, какова конкретная причина для этого конкретного табу?

Мое подозрение: делать такмешает тонкой балансировке нагрузкиУпражнения в бассейне.Но это не объясняет, почему некоторые источники говорят, что вы не можете изменить его.

Ответы [ 6 ]

21 голосов
/ 08 апреля 2011

Пул потоков, особенно пул потоков .NET 4.0, имеет множество хитростей и является довольно сложной системой. Добавьте в задачи и планировщики задач и воровство работы и все другие вещи, и реальность такова, что вы не знаете, что происходит. Пул потоков может заметить, что ваша задача ожидает ввода-вывода, и принять решение запланировать что-то быстрое для вашей задачи или приостановить ваш поток для выполнения чего-то с более высоким приоритетом. Ваш поток может как-то зависеть от потока с более высоким приоритетом (о котором вы можете знать, а может и не знать) и в конечном итоге вызывать взаимоблокировку. Ваша ветка может ненормально прерваться и не сможет восстановить приоритет.

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

8 голосов
/ 13 мая 2011

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

2 голосов
/ 19 декабря 2011

Снижение приоритета также может привести к неожиданным последствиям.

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

Увеличение числа потоков пула уменьшило бы это, за счет того, что мы тратим больше памяти на стеки и тратим больше времени процессора на переключатели контекста.

0 голосов
/ 13 мая 2011

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

Не предлагать слишком сложный ответ, но в целом приоритет потоков - сложная тема.Например, Windows имеет 2 связанных дескриптора: приоритет потока и приоритет процесса.Оба диапазона варьируются от холостого хода, самого низкого до критического по времени, самого высокого.Когда вы запускаете новый процесс, для него устанавливается значение по умолчанию, средний диапазон (обычный приоритет процесса с обычным приоритетом потока).

Плюс, приоритеты потоков являются относительными, что означает, что даже установка приоритета потокасамая высокая в загруженной системе не гарантирует, что она будет работать в режиме реального времени.DotNET не дает никаких гарантий и Windows.Из этого вы можете понять, почему лучше оставить пул потоков в покое, так как в 99,9% случаев он знает лучше:)

Все это говорит о том, что можно уменьшить приоритет потока, если задача требуетвычисление.Это не повлияет на другие процессы.

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

0 голосов
/ 08 апреля 2011

Если вы что-то изменили, используйте try / finally, чтобы убедиться, что вы оставили все как есть.

0 голосов
/ 08 апреля 2011

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

...