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


Класс Context

Представляет абстракцию для контекста выполнения.

Синтаксис

class Context;

Участники

Защищенные конструкторы

Имя Описание
~Context Destructor

Открытые методы

Имя Описание
Block Блокирует текущий контекст.
CurrentContext Возвращает указатель на текущий контекст.
GetId Возвращает идентификатор контекста, который уникален в планировщике, к которому принадлежит контекст.
GetScheduleGroupId Возвращает идентификатор группы расписаний, над которым в настоящее время работает контекст.
GetVirtualProcessorId Возвращает идентификатор виртуального процессора, в который в настоящее время выполняется контекст.
Id Возвращает идентификатор текущего контекста, уникального в планировщике, которому принадлежит текущий контекст.
ТекущаяКоллекцияЗадачОтменяется Возвращает значение, указывающее, находится ли коллекция задач, которая в настоящее время выполняется встроенным образом в текущем контексте, находится в разгар активной отмены (или будет в ближайшее время).
IsSynchronouslyBlocked Определяет, блокируется ли контекст синхронно или нет. Контекст считается синхронно заблокированным, если он явно выполнил действие, которое привело к блокировке.
Оверсубскрайб Внедряет дополнительный виртуальный процессор в планировщик на время выполнения блока кода, когда он вызывается на контексте, который выполняется на одном из виртуальных процессоров этого планировщика.
ИдентификаторГруппыРасписания Возвращает идентификатор группы расписаний, над которым работает текущий контекст.
Разблокировать Разблокирует контекст и делает его доступным для выполнения.
VirtualProcessorId Возвращает идентификатор виртуального процессора, на который выполняется текущий контекст.
Yield Передаёт управление, чтобы выполнялся другой контекст. Если нет других доступных контекстов для уступки, планировщик может уступить выполнение другому потоку операционной системы.

Замечания

Планировщик Concurrency Runtime (см. Scheduler) использует контексты выполнения для выполнения работы, поставленной в очередь приложением. Поток Win32 является примером контекста выполнения в операционной системе Windows.

В любое время уровень параллелизма планировщика равен количеству виртуальных процессоров, предоставленных ему Resource Manager. Виртуальный процессор — это абстракция для ресурса обработки и соответствует потокам аппаратного обеспечения основной системы. Только один контекст планировщика может выполняться на виртуальном процессоре в определенное время.

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

Иерархия наследования

Context

Требования

Заголовок: concrt.h

Пространство имен: конкурентность

Блокировка

Блокирует текущий контекст.

static void __cdecl Block();

Замечания

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

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

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

Этот метод может вызывать различные исключения, включая scheduler_resource_allocation_error.

~Контекст

virtual ~Context();

ТекущийКонтекст

Возвращает указатель на текущий контекст.

static Context* __cdecl CurrentContext();

Возвращаемое значение

Указатель на текущий контекст.

Замечания

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

GetId

Возвращает идентификатор контекста, который уникален в планировщике, к которому принадлежит контекст.

virtual unsigned int GetId() const = 0;

Возвращаемое значение

Идентификатор контекста, который является уникальным в планировщике, к которому принадлежит контекст.

GetScheduleGroupId

Возвращает идентификатор группы расписаний, над которым в настоящее время работает контекст.

virtual unsigned int GetScheduleGroupId() const = 0;

Возвращаемое значение

Идентификатор группы расписаний, над которым в настоящее время работает контекст.

Замечания

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

GetVirtualProcessorId

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

virtual unsigned int GetVirtualProcessorId() const = 0;

Возвращаемое значение

Если контекст в настоящее время выполняется на виртуальном процессоре, идентификатор виртуального процессора, в который в данный момент выполняется контекст; в противном случае — значение -1.

Замечания

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

Артикул

Возвращает идентификатор текущего контекста, уникального в планировщике, которому принадлежит текущий контекст.

static unsigned int __cdecl Id();

Возвращаемое значение

Если текущий контекст присоединен к планировщику, идентификатор текущего контекста, уникального в планировщике, к которому принадлежит текущий контекст; в противном случае — значение -1.

ТекущаяКоллекцияЗадачОтменяется

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

static bool __cdecl IsCurrentTaskCollectionCanceling();

Возвращаемое значение

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

СинхронноЗаблокировано

Определяет, блокируется ли контекст синхронно или нет. Контекст считается синхронно заблокированным, если он явно выполнил действие, которое привело к блокировке.

virtual bool IsSynchronouslyBlocked() const = 0;

Возвращаемое значение

Блокируется ли контекст синхронно.

Замечания

Контекст считается синхронно заблокированным, если он явно выполнил действие, которое привело к блокировке. В планировщике потоков это означает прямой вызов метода Context::Block или объекта синхронизации, который был создан с помощью метода Context::Block.

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

Оператор delete

Объект Context уничтожается средой выполнения изнутри. Его невозможно удалить явно.

void operator delete(void* _PObject);

Параметры

_PObject
Указатель на объект, который нужно удалить.

Переподписываться

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

static void __cdecl Oversubscribe(bool _BeginOversubscription);

Параметры

_BeginOversubscription
Если true, это указывает, что дополнительный виртуальный процессор должен быть добавлен на время сверхподписки. Если false указывает на необходимость закончить перегрузку, ранее добавленный виртуальный процессор должен быть удален.

ScheduleGroupId

Возвращает идентификатор группы расписаний, над которым работает текущий контекст.

static unsigned int __cdecl ScheduleGroupId();

Возвращаемое значение

Если текущий контекст присоединен к планировщику и работает над группой расписаний, идентификатор группы планировщика, над которым работает текущий контекст; в противном случае — значение -1.

Разблокировать

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

virtual void Unblock() = 0;

Замечания

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

Существует несколько исключений, которые можно вызвать из этого метода. Если контекст пытается вызвать метод Unblock на самом себе, возникнет исключение context_self_unblock. Если вызовы Block и Unblock не связаны должным образом (например, два вызова Unblock произведены для контекста, который в данный момент выполняется), будет выброшено исключение context_unblock_unbalanced.

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

VirtualProcessorId

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

static unsigned int __cdecl VirtualProcessorId();

Возвращаемое значение

Если текущий контекст подключен к планировщику, идентификатор виртуального процессора, на который выполняется текущий контекст; в противном случае — значение -1.

Замечания

Возвращаемое значение этого метода представляет собой мгновенный снимок виртуального процессора, на котором выполняется текущий контекст. Это значение может быть устаревшим в момент возврата, и на него нельзя полагаться. Как правило, этот метод используется только для отладки или трассировки.

Доходность

Передаёт управление, чтобы выполнялся другой контекст. Если нет других доступных контекстов для уступки, планировщик может уступить выполнение другому потоку операционной системы.

static void __cdecl Yield();

Замечания

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

YieldExecution

Передаёт управление, чтобы выполнялся другой контекст. Если нет других доступных контекстов для уступки, планировщик может уступить выполнение другому потоку операционной системы.

static void __cdecl YieldExecution();

Замечания

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

Эта функция является новой в Visual Studio 2015 и идентична функции Yield, но не конфликтует с макросом Yield в Windows.h.

См. также

Пространство имен параллелизм
Класс Scheduler
Планировщик заданий