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


Класс Context

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

Синтаксис

class Context;

Участники

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

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

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

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

Замечания

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

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

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

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

Context

Требования

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

Пространство имен: concurrency

Блокировка

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

static void __cdecl Block();

Замечания

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

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

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

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

~Контекст

virtual ~Context();

CurrentContext

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

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.

IsCurrentTaskCollectionCanceling

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

static bool __cdecl IsCurrentTaskCollectionCanceling();

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

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

IsSynchronouslyBlocked

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

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.

Замечания

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

Yield

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

static void __cdecl Yield();

Замечания

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

YieldExecution

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

static void __cdecl YieldExecution();

Замечания

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

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

См. также

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