Методы децентрализованного планирования задач в.NET

Я пытался узнать больше деталей о CLR 4.0. и ThreadPool и различные стратегии, рекомендованные Microsoft. Я считаю себя достаточно современным по многим из этих тем и ежедневно использую многопоточность и параллельный код.

Недавно я снова прошел через Параллельные паттерны и практики, и немного попал в раздел " Методы децентрализованного планирования ", в котором дается краткий обзор "Воровства работы" и локальных и глобальных очередей потоков.

У меня есть следующие вопросы:

1) Является ли работа воровством отказаться или отказаться? То же самое для использования локальных очередей потоков? Или это происходит по умолчанию с CLR 4.0?

2) Имеем ли мы контроль над тем, используем ли мы локальные или глобальные очереди потоков? Если да, то через какие вызовы API?

2 ответа

1) Является ли работа воровством отказаться или отказаться? То же самое для использования локальных очередей потоков? Или это происходит по умолчанию с CLR 4.0?

Похищение работы по умолчанию. В.NET 4.0 ThreadPool был расширен за счет кражи работы. И заданный по умолчанию TaskScheduler (System.Threading.Tasks.ThreadPoolTaskScheduler) основан на классе ThreadPool. Так что это по умолчанию, начиная с 4.0.

2) Имеем ли мы контроль над тем, используем ли мы локальные или глобальные очереди потоков? Если да, то через какие вызовы API?

Как уже упоминалось @Servy, для полного контроля вам нужно написать собственный TaskScheduler. (как описано в разделе Как создать планировщик задач, ограничивающий параллелизм)

Но вы можете как-то повлиять на поведение очереди с помощью TaskCreationOptions:

  • LongRunning: Задача получает вновь созданную тему вне Treadpool
  • PreferFairness: новые дочерние задачи (которые обычно оказываются в локальной очереди потока, выполнившего родительскую задачу) будут попадать в глобальную очередь. Таким образом, если все задачи помечены "PreferFairness", кража работы и локальная организация очереди будут эффективно деактивированы.

Но, как подчеркивается в этой статье о PreferFairness, детали реализации / эффект этих флагов могут измениться с новыми реализациями.NET Framework.

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

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

Другие вопросы по тегам