Экземпляры планировщика
В этом документе описывается роль экземпляров планировщика в среде выполнения с параллелизмом, а также описано, как использовать классы 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.
Метод |
Описание |
---|---|
Создает объект Scheduler, который использует заданную политику и связывает ее с текущим контекстом. |
|
Извлекает указатель на объект Scheduler, связанный с текущим контекстом. Этот метод не увеличивает число ссылок объекта Scheduler. |
|
Отсоединяет текущий планировщик из текущего контекста и задает в качестве текущего планировщика предыдущий. |
|
Регистрирует событие, которое среда выполнения задает при уничтожении текущего планировщика. |
|
Создает объект concurrency::ScheduleGroup в текущем планировщике. |
|
Добавляет упрощенную задачу в очередь планирования текущего планировщика. |
|
Извлекает копию политики, связанной с текущим планировщиком. |
В следующей таблице указаны важные методы, определяемые классом Scheduler.
Метод |
Описание |
---|---|
Создает объект Scheduler, использующий заданную политику. |
|
Связывает объект Scheduler с текущим контекстом. |
|
Увеличивает число ссылок объекта Scheduler. |
|
Уменьшает число ссылок объекта Scheduler. |
|
Регистрирует событие, которое среда выполнения задает при уничтожении объекта Scheduler. |
|
Создает объект concurrency::ScheduleGroup в объекте Scheduler. |
|
Планирует упрощенную задачу из объекта Scheduler. |
|
Извлекает копию политики, связанную с объектом Scheduler. |
|
Задает политику для использования средой выполнения при создании планировщика по умолчанию. |
|
Восстанавливает в качестве политики по умолчанию ту, которая была активной до вызова метода SetDefaultSchedulerPolicy. Если планировщик по умолчанию создается после этого вызова, среда выполнения использует для создания планировщика настройки политики по умолчанию. |
[Наверх]
Пример
Общие примеры создания экземпляра планировщика и управления им см. в разделе Практическое руководство. Управление экземпляром планировщика.
См. также
Задачи
Практическое руководство. Управление экземпляром планировщика