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

В этом документе описывается роль экземплярами планировщика параллелизма во время выполнения и как использовать 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.

Метод

Описание

Create

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

Get

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

Отсоединить

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

RegisterShutdownEvent

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

CreateScheduleGroup

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

ScheduleTask

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

GetPolicy

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

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

Метод

Описание

Create

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

Присоединиться

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

Ссылки

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

Release

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

RegisterShutdownEvent

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

CreateScheduleGroup

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

ScheduleTask

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

GetPolicy

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

SetDefaultSchedulerPolicy

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

ResetDefaultSchedulerPolicy

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

Top

Пример

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

См. также

Задачи

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

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

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

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

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