Экземпляры планировщика

В этом документе описывается роль экземпляров планировщика в среде выполнения с параллелизмом, а также описано, как использовать классы Concurrency::Scheduler и Concurrency::CurrentScheduler, чтобы создавать экземпляры планировщиков и управлять ими. Экземпляры планировщика позволяют связывать явные политики планирования с определенными типами рабочих нагрузок. Например, можно создать один экземпляр планировщика для выполнения некоторых задач с повышенным приоритетом потока, а планировщик по умолчанию — для выполнения задач с обычным приоритетом потока.

Совет

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

Подразделы

  • Планировщик и классы CurrentScheduler

  • Создание экземпляра планировщика

  • Управление временем существования экземпляра планировщика

  • Методы и свойства

  • Пример

Планировщик и классы CurrentScheduler

Планировщик заданий позволяет приложениям использовать один или несколько экземпляров планировщика для планирования работы. Класс Concurrency::Scheduler представляет экземпляр планировщика и содержит функциональные возможности, связанные с планированием задач.

Поток, прикрепленный к планировщику, известен как контекст выполнения или просто контекст. В любой момент времени в текущем контексте может быть активен только один планировщик. Активный планировщик также известен как текущий планировщик. Среда выполнения с параллелизмом использует класс Concurrency::CurrentScheduler для предоставления доступа к текущему планировщику. Текущий планировщик для одного контекста может отличаться от текущего планировщика для другого контекста. Среда выполнения не предоставляет представление текущего планировщика на уровне процесса.

Как правило, класс CurrentScheduler используется для осуществления доступа к текущему планировщику. Класс Scheduler удобен при необходимости управлять планировщиком, не являющимся текущим.

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

[в начало]

Создание экземпляра планировщика

Существует три способа создания объекта Scheduler.

  • Если планировщика не существует, среда выполнения создает планировщик по умолчанию, когда пользователь использует для выполнения работы функции среды выполнения, например параллельный алгоритм. Планировщик по умолчанию становится текущим планировщиком для контекста, инициирующего параллельную работу.

  • Метод Concurrency::CurrentScheduler::Create создает объект Scheduler, использующий конкретную политику и связывающий этот планировщик с текущим контекстом.

  • Метод Concurrency::Scheduler::Create создает объект Scheduler, использующий конкретную политику, но не связывает его с текущим контекстом.

Если среде выполнения разрешается создавать планировщик по умолчанию, все параллельные задачи могут совместно использовать один и тот же планировщик. Обычно функции библиотеки параллельных шаблонов (PPL) или библиотеки асинхронных агентов используются для выполнения параллельной работы. Следовательно, чтобы контролировать политику или время существования планировщика, не обязательно работать с ним напрямую. При использовании библиотеки параллельных шаблонов или библиотеки агентов среда выполнения создает планировщик по умолчанию, если его не существует, и делает его текущим планировщиком для каждого контекста. Если создается планировщик и задается в качестве текущего, среда выполнения использует этот планировщик для планирования заданий. Создавать дополнительные экземпляры планировщика следует только тогда, когда требуется определенная политика планирования. Дополнительные сведения о политиках, выключенных в планировщик, см. в разделе Политики планировщика.

[в начало]

Управление временем существования экземпляра планировщика

Среда выполнения использует механизм подсчета ссылок для управления временем существования объектов Scheduler.

При использовании метода CurrentScheduler::Create или Scheduler::Create для создания объекта Scheduler среда выполнения задает начальное число ссылок этого планировщика, равное 1. Среда выполнения увеличивает число ссылок при каждом вызове метода Concurrency::Scheduler::Attach. Метод Scheduler::Attach связывает объект Scheduler с текущим контекстом. После этого он становится текущим планировщиком. При вызове метода CurrentScheduler::Create среда выполнения создает объект Scheduler и прикрепляет его к текущему контексту (и задает число ссылок, равное 1). Кроме того, для увеличения числа ссылок объекта Scheduler можно использовать метод Concurrency::Scheduler::Reference.

Среда выполнения уменьшает число ссылок при вызове метода Concurrency::CurrentScheduler::Detach для отсоединения текущего планировщика или вызове метода Concurrency::Scheduler::Release. Когда число ссылок достигает нуля, среда выполнения уничтожает объект Scheduler после завершения всех запланированных задач. Выполняемая задача может увеличивать число ссылок текущего планировщика. Следовательно, если число ссылок достигает нуля и задача увеличивает это число ссылок, среда выполнения не уничтожает объект Scheduler до тех пор, пока число ссылок снова не станет равным нулю и не завершатся все задачи.

Среда выполнения поддерживает внутренний стек объектов Scheduler для каждого контекста. При вызове метода Scheduler::Attach или CurrentScheduler::Create среда выполнения помещает объект Scheduler в стек текущего контекста. После этого он становится текущим планировщиком. При вызове метода CurrentScheduler::Detach среда выполнения извлекает текущий планировщик из стека текущего контекста и задает в качестве текущего предыдущий планировщик.

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

Метод создания или присоединения

Метод освобождения или отсоединения

CurrentScheduler::Create

CurrentScheduler::Detach

Scheduler::Create

Scheduler::Release

Scheduler::Attach

CurrentScheduler::Detach

Scheduler::Reference

Scheduler::Release

Вызов неподходящего метода освобождения или отсоединения создает незаданное поведение в среде выполнения.

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

Так как среда выполнения не уничтожает объект Scheduler до завершения всех задач, можно использовать метод Concurrency::Scheduler::RegisterShutdownEvent или Concurrency::CurrentScheduler::RegisterShutdownEvent для получения уведомления об уничтожении объекта Scheduler. Это полезно, если приходится ожидать завершения каждой задачи, запланированной объектом Scheduler.

[в начало]

Методы и свойства

В этом подразделе обобщаются важные методы классов CurrentScheduler и Scheduler.

Класс CurrentScheduler можно назвать вспомогательным средством создания планировщика для использования в текущем контексте. Класс Scheduler позволяет контролировать планировщик, принадлежащий к другому контексту.

В следующей таблице указаны важные методы, определяемые классом CurrentScheduler.

Метод

Описание

Create

Создает объект Scheduler, который использует заданную политику и связывает ее с текущим контекстом.

Get

Извлекает указатель на объект Scheduler, связанный с текущим контекстом. Этот метод не увеличивает число ссылок объекта Scheduler.

Detach

Отсоединяет текущий планировщик из текущего контекста и задает в качестве текущего планировщика предыдущий.

RegisterShutdownEvent

Регистрирует событие, которое среда выполнения задает при уничтожении текущего планировщика.

CreateScheduleGroup

Создает объект Concurrency::ScheduleGroup в текущем планировщике.

ScheduleTask

Добавляет упрощенную задачу в очередь планирования текущего планировщика.

GetPolicy

Извлекает копию политики, связанной с текущим планировщиком.

В следующей таблице указаны важные методы, определяемые классом Scheduler.

Метод

Описание

Create

Создает объект Scheduler, использующий заданную политику.

Attach

Связывает объект Scheduler с текущим контекстом.

Reference

Увеличивает число ссылок объекта Scheduler.

Release

Уменьшает число ссылок объекта Scheduler.

RegisterShutdownEvent

Регистрирует событие, которое среда выполнения задает при уничтожении объекта Scheduler.

CreateScheduleGroup

Создает объект Concurrency::ScheduleGroup в объекте Scheduler.

ScheduleTask

Планирует упрощенную задачу из объекта Scheduler.

GetPolicy

Извлекает копию политики, связанную с объектом Scheduler.

SetDefaultSchedulerPolicy

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

ResetDefaultSchedulerPolicy

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

[в начало]

Пример

Общие примеры создания экземпляра планировщика и управления им см. в разделе Практическое руководство. Управление экземпляром планировщика.

См. также

Основные понятия

Планировщик задач (среда выполнения с параллелизмом)

Другие ресурсы

Практическое руководство. Управление экземпляром планировщика

Политики планировщика

Группы расписаний

Журнал изменений

Дата

Журнал

Причина

Июль 2010

Содержимое реорганизовано.

Улучшение информации.