Поделиться через


Контексты

В этом документе описана роль контекстов в среде выполнения с параллелизмом.Поток, прикрепленный к планировщику, известен как контекст выполнения или просто контекст.Concurrency::wait функции и concurrency::Context позволяют управлять поведением контекстов.Функция wait приостанавливает текущий контекст на заданный период времени.Класс Context позволяет управлять контекстами, когда они блокируются, разблокируются и передают выполнение, а также если нужно превысить лимит подписки текущего контекста.

СоветСовет

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

Функция wait

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

Если параметру milliseconds передано значение 0 (нуль), среда выполнения приостанавливает текущий контекст до тех пор, пока другие активные контексты не получат возможность выполнять работу.Это позволяет передать задачу всем другим активным задачам.

Ff829266.collapse_all(ru-ru,VS.110).gifПример

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

Класс Context

Concurrency::Context класс предоставляет программную абстракцию для контекста выполнения, а также две важные функции: возможность налаживании заблокировать разблокировать и выдают текущего контекста и возможность oversubscribe текущего контекста.

Ff829266.collapse_all(ru-ru,VS.110).gifСовместное блокирование

Класс Context позволяет блокировать или разрешать текущий контекст выполнения.Блокирование и передача полезны, если текущий контекст не может продолжать работу из-за недоступности ресурса.

Concurrency::Context::Block метод блокирует текущий контекст.Заблокированный контекст передает свои ресурсы для обработки, чтобы среда выполнения могла выполнить другие задачи.Concurrency::Context::Unblock метод Разблокирует заблокированный контекста.Методы Context::Unblock и Context::Block должны вызываться из разных контекстов.Среда выполнения создает concurrency::context_self_unblock Если контекст пытается снять блокировку.

Налаживании блокировать и разблокировать контекст, обычно вызывается concurrency::Context::CurrentContext для получения указателя на Context объект, связанный с текущим потоком и сохранить результат.Затем необходимо вызвать метод Context::Block для блокирования текущего контекста.После этого для разблокирования заблокированного контекста необходимо вызвать метод Context::Unblock из отдельного контекста.

Необходимо сопоставить каждую пару вызовов методам Context::Block и Context::Unblock.Среда выполнения создает concurrency::context_unblock_unbalanced при Context::Block или Context::Unblock метод вызывается последовательно без соответствующего вызова другого метода.Однако не обязательно вызывать метод Context::Block до вызова метода Context::Unblock.Например, если один контекст вызывает метод Context::Unblock до того, как другой контекст вызовет метод Context::Block для того же контекста, контекст остается незаблокированным.

Concurrency::Context::Yield метод обеспечивает выполнение таким образом, чтобы среда выполнения может выполнять другие задачи и затем изменить расписание контекста выполнения.При вызове метода Context::Block среда выполнения не перепланирует контекст.

Ff829266.collapse_all(ru-ru,VS.110).gifПример

Пример, в котором методы Context::Block, Context::Unblock и Context::Yield используются для реализации класса семафора, поддерживающего параллельный доступ, см. в разделе Практическое руководство. Использование класса Context для реализации семафора, поддерживающего параллельный доступ.

Ff829266.collapse_all(ru-ru,VS.110).gifПревышение лимита подписки

Число потоков, создаваемых планировщиком по умолчанию, совпадает с числом доступных аппаратных потоков.Превышение лимита подписки можно использовать для создания дополнительных потоков для заданного аппаратного потока.

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

ПримечаниеПримечание

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

Включение возможностью переподписки в текущем контексте вызова concurrency::Context::Oversubscribe метода с _BeginOversubscription параметру true.Если превышение лимита подписки разрешено для потока, созданного в среде выполнения с параллелизмом, среда выполнения создает один дополнительный поток.После завершения всех задач, требующих превышения лимита подписки, необходимо вызвать метод Context::Oversubscribe, параметру _BeginOversubscription которого задано значение false.

В текущем контексте можно разрешать превышение лимита подписки несколько раз, при этом запрещать его необходимо столько же раз.Превышение лимита подписки также может быть вложенным; т. е. задача, созданная другой задачей, которая использует превышение лимита подписки, также может превышать лимит подписки своего контекста.Однако если и вложенная задача, и родительская задача принадлежат к одному контексту, дополнительный поток создается только при самом внешнем вызове метода Context::Oversubscribe.

ПримечаниеПримечание

Среда выполнения создает concurrency::invalid_oversubscribe_operation при отключении возможностью переподписки до его включения.

Ff829266.collapse_all(ru-ru,VS.110).gifПример

Пример, в котором превышение лимита подписки используется для смещения задержки, возникающей из-за считывания данных из сетевого подключения, см. в разделе Практическое руководство. Использование лимита подписки для устранения задержек.

См. также

Задачи

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

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

Практическое руководство. Использование лимита подписки для устранения задержек

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

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