Экземпляры планировщика
В этом документе описывается роль экземплярами планировщика параллелизма во время выполнения и как использовать concurrency::Scheduler и concurrency::CurrentScheduler классы для создания и управления экземплярами планировщика.Экземпляры планировщика позволяют связывать явные политики планирования с определенными типами рабочих нагрузок.Например, можно создать один экземпляр планировщика для выполнения некоторых задач с повышенным приоритетом потока, а планировщик по умолчанию — для выполнения задач с обычным приоритетом потока.
Совет |
---|
Среда выполнения с параллелизмом предоставляет планировщик по умолчанию, поэтому вам не обязательно создавать собственный.Так как планировщик заданий помогает оптимизировать производительность приложений, рекомендуется начать с раздела Библиотека параллельных шаблонов или Библиотека асинхронных агентов, если вы не знакомы со средой выполнения с параллелизмом. |
Подразделы
Планировщик и классы CurrentScheduler
Создание экземпляра планировщика
Управление временем существования экземпляра планировщика
Методы и свойства
Пример
Планировщик и классы CurrentScheduler
Планировщик заданий позволяет приложениям использовать один или несколько экземпляров планировщика для планирования работы.Concurrency::Scheduler класс представляет экземпляр планировщика заданий и инкапсулирует функциональные возможности, связанные с планированием заданий.
Поток, прикрепленный к планировщику, известен как контекст выполнения или просто контекст.В любой момент времени в текущем контексте может быть активен только один планировщик.Активный планировщик также известен как текущий планировщик.Параллелизм среда выполнения использует concurrency::CurrentScheduler класса для обеспечения доступа к текущей планировщика заданий.Текущий планировщик для одного контекста может отличаться от текущего планировщика для другого контекста.Среда выполнения не предоставляет представление текущего планировщика на уровне процесса.
Как правило, класс CurrentScheduler используется для осуществления доступа к текущему планировщику.Класс Scheduler удобен при необходимости управлять планировщиком, не являющимся текущим.
В следующих разделах описано создание экземпляра планировщика и управление им.Полный пример, в котором показаны эти задачи, см. в разделе Практическое руководство. Управление экземпляром планировщика.
Top
Создание экземпляра планировщика
Существует три способа создания объекта Scheduler.
Если планировщика не существует, среда выполнения создает планировщик по умолчанию, когда пользователь использует для выполнения работы функции среды выполнения, например параллельный алгоритм.Планировщик по умолчанию становится текущим планировщиком для контекста, инициирующего параллельную работу.
Concurrency::CurrentScheduler::Create создает метод Scheduler объекта, который использует определенные политики и связывает с текущим контекстом, планировщик заданий.
Concurrency::Scheduler::Create создает метод Scheduler объекта, который использует определенные политики, но не связывает с текущим контекстом.
Если среде выполнения разрешается создавать планировщик по умолчанию, все параллельные задачи могут совместно использовать один и тот же планировщик.Обычно функции библиотеки параллельных шаблонов (PPL) или библиотеки асинхронных агентов используются для выполнения параллельной работы.Следовательно, чтобы контролировать политику или время существования планировщика, не обязательно работать с ним напрямую.При использовании библиотеки параллельных шаблонов или библиотеки агентов среда выполнения создает планировщик по умолчанию, если его не существует, и делает его текущим планировщиком для каждого контекста.Если создается планировщик и задается в качестве текущего, среда выполнения использует этот планировщик для планирования заданий.Создавать дополнительные экземпляры планировщика следует только тогда, когда требуется определенная политика планирования.Дополнительные сведения о политиках, выключенных в планировщик, см. в разделе Политики планировщика.
Top
Управление временем существования экземпляра планировщика
Среда выполнения использует механизм подсчета ссылок для управления временем существования объектов Scheduler.
При использовании метода CurrentScheduler::Create или Scheduler::Create для создания объекта Scheduler среда выполнения задает начальное число ссылок этого планировщика, равное 1.Среда выполнения увеличивает счетчик ссылок при вызове concurrency::Scheduler::Attach метод.Метод Scheduler::Attach связывает объект Scheduler с текущим контекстом.После этого он становится текущим планировщиком.При вызове метода CurrentScheduler::Create среда выполнения создает объект Scheduler и прикрепляет его к текущему контексту (и задает число ссылок, равное 1).Можно также использовать concurrency::Scheduler::Reference метода следует выполнить приращение счетчика ссылок Scheduler объект.
Уменьшает время выполнения, счетчика ссылок при вызове метода 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.
Top
Методы и свойства
В этом подразделе обобщаются важные методы классов CurrentScheduler и Scheduler.
Класс CurrentScheduler можно назвать вспомогательным средством создания планировщика для использования в текущем контексте.Класс Scheduler позволяет контролировать планировщик, принадлежащий к другому контексту.
В следующей таблице указаны важные методы, определяемые классом CurrentScheduler.
Метод |
Описание |
---|---|
Создает объект Scheduler, который использует заданную политику и связывает ее с текущим контекстом. |
|
Извлекает указатель на объект Scheduler, связанный с текущим контекстом.Этот метод не увеличивает число ссылок объекта Scheduler. |
|
Отсоединяет текущий планировщик из текущего контекста и задает в качестве текущего планировщика предыдущий. |
|
Регистрирует событие, которое среда выполнения задает при уничтожении текущего планировщика. |
|
Создает concurrency::ScheduleGroup объекта текущего планировщика. |
|
Добавляет упрощенную задачу в очередь планирования текущего планировщика. |
|
Извлекает копию политики, связанной с текущим планировщиком. |
В следующей таблице указаны важные методы, определяемые классом Scheduler.
Метод |
Описание |
---|---|
Создает объект Scheduler, использующий заданную политику. |
|
Связывает объект Scheduler с текущим контекстом. |
|
Увеличивает число ссылок объекта Scheduler. |
|
Уменьшает число ссылок объекта Scheduler. |
|
Регистрирует событие, которое среда выполнения задает при уничтожении объекта Scheduler. |
|
Создает concurrency::ScheduleGroup объект в Scheduler объект. |
|
Планирует упрощенную задачу из объекта Scheduler. |
|
Извлекает копию политики, связанную с объектом Scheduler. |
|
Задает политику для использования средой выполнения при создании планировщика по умолчанию. |
|
Восстанавливает в качестве политики по умолчанию ту, которая была активной до вызова метода SetDefaultSchedulerPolicy.Если планировщик по умолчанию создается после этого вызова, среда выполнения использует для создания планировщика настройки политики по умолчанию. |
Top
Пример
Общие примеры создания экземпляра планировщика и управления им см. в разделе Практическое руководство. Управление экземпляром планировщика.
См. также
Задачи
Практическое руководство. Управление экземпляром планировщика