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

Почему * не * изменить приоритет потока ThreadPool (или Task)?

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

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

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

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

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

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

Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

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

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