Контексты

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

Совет

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

Функция ожидания

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

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

Пример

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

Класс Context

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

Совместная блокировка

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

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

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

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

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

Пример

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

Превышение лимита подписки

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

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

Примечание.

Разрешать превышение лимита подписки следует только в потоке, созданном средой выполнения с параллелизмом. Oversubscription не влияет на вызов из потока, который не был создан средой выполнения (включая основной поток).

Чтобы включить oversubscription в текущем контексте, вызовите метод параллелизма::Context::Oversubscribe с заданным параметром _BeginOversubscriptiontrue. При включении oversubscription в потоке, созданном средой выполнения параллелизма, среда выполнения создает один дополнительный поток. После завершения всех задач, требующих перезаписи, вызовите Context::Oversubscribe параметр с заданным параметром _BeginOversubscriptionfalse.

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

Примечание.

Среда выполнения создает параллелизм::invalid_oversubscribe_operation , если превышение избыточности отключено до включения.

Пример

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

См. также

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