Класс 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
Планировщик заданий