Класс 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();
Возвращает указатель на текущий контекст.
static Context* __cdecl CurrentContext();
Указатель на текущий контекст.
В результате этого метода в процессе будет создан планировщик по умолчанию и/или присоединен к вызывающему контексту, если отсутствует планировщик, в данный момент связанный с вызывающим контекстом.
Возвращает идентификатор контекста, уникального в планировщике, к которому принадлежит контекст.
virtual unsigned int GetId() const = 0;
Идентификатор контекста, уникального в планировщике, к которому принадлежит контекст.
Возвращает идентификатор группы расписаний, над которым в настоящее время работает контекст.
virtual unsigned int GetScheduleGroupId() const = 0;
Идентификатор группы расписаний, над которым в настоящее время работает контекст.
Возвращаемое значение из этого метода является мгновенной выборкой группы расписаний, в которую выполняется контекст. Если этот метод вызывается в контексте, отличном от текущего контекста, значение может быть устаревшим в момент возврата и полагаться на него нельзя. Как правило, этот метод используется только для отладки или трассировки.
Возвращает идентификатор виртуального процессора, в который в настоящее время выполняется контекст.
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
.
Возвращаемое значение из этого метода является мгновенным примером того, блокируется ли контекст синхронно. Это значение может быть устаревшим, когда он возвращается, и его можно использовать только в определенных обстоятельствах.
Context
Объект уничтожается внутренне средой выполнения. Его невозможно удалить явно.
void operator delete(void* _PObject);
_PObject
Указатель на объект, который нужно удалить.
Внедряет дополнительный виртуальный процессор в планировщик в течение длительности блока кода при вызове контекста, выполняемого на одном из виртуальных процессоров в этом планировщике.
static void __cdecl Oversubscribe(bool _BeginOversubscription);
_BeginOversubscription
Если true
значение указывает, что дополнительный виртуальный процессор должен быть добавлен в течение чрезмерного времени. Если false
указывает, что перезапись должна заканчиваться, а ранее добавленный виртуальный процессор должен быть удален.
Возвращает идентификатор группы расписаний, над которым работает текущий контекст.
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
пару.
Возвращает идентификатор виртуального процессора, на который выполняется текущий контекст.
static unsigned int __cdecl VirtualProcessorId();
Если текущий контекст подключен к планировщику, идентификатор виртуального процессора, на который выполняется текущий контекст; в противном случае — значение -1
.
Возвращаемое значение из этого метода является мгновенной выборкой виртуального процессора, в который выполняется текущий контекст. Это значение может быть устаревшим в момент возврата, и на него нельзя полагаться. Как правило, этот метод используется только для отладки или трассировки.
Уступает выполнение, чтобы мог выполняться другой контекст. Если доступных контекстов для уступки выполнения нет, планировщик может уступить выполнение другому потоку операционной системы.
static void __cdecl Yield();
В результате этого метода в процессе будет создан планировщик по умолчанию и/или присоединен к вызывающему контексту, если отсутствует планировщик, в данный момент связанный с вызывающим контекстом.
Уступает выполнение, чтобы мог выполняться другой контекст. Если доступных контекстов для уступки выполнения нет, планировщик может уступить выполнение другому потоку операционной системы.
static void __cdecl YieldExecution();
В результате этого метода в процессе будет создан планировщик по умолчанию и/или присоединен к вызывающему контексту, если отсутствует планировщик, в данный момент связанный с вызывающим контекстом.
Эта функция является новой в Visual Studio 2015 и идентична функции Yield, но не конфликтует с макросом "Выход " в Windows.h.
Пространство имен concurrency
Класс Scheduler
Планировщик заданий