Класс ContextContext Class

Представляет абстракцию для контекста выполнения.Represents an abstraction for an execution context.

СинтаксисSyntax

class Context;

ЧленыMembers

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

ИмяName ОписаниеDescription
Деструктор контекста ~~Context Destructor

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

nameName ОписаниеDescription
ЗаблокироватьBlock Блокирует текущий контекст.Blocks the current context.
CurrentContextCurrentContext Возвращает указатель на текущий контекст.Returns a pointer to the current context.
GetIdGetId Возвращает идентификатор для контекста, уникального внутри планировщика, которому принадлежит контекст.Returns an identifier for the context that is unique within the scheduler to which the context belongs.
жетсчедулеграупидGetScheduleGroupId Возвращает идентификатор для группы расписаний, над которой в данный момент работает контекст.Returns an identifier for the schedule group that the context is currently working on.
жетвиртуалпроцессоридGetVirtualProcessorId Возвращает идентификатор виртуального процессора, на котором в данный момент выполняется контекст.Returns an identifier for the virtual processor that the context is currently executing on.
IdId Возвращает идентификатор для текущего контекста, уникального в пределах планировщика, к которому принадлежит текущий контекст.Returns an identifier for the current context that is unique within the scheduler to which the current context belongs.
искурренттаскколлектионканцелингIsCurrentTaskCollectionCanceling Возвращает значение, указывающее, находится ли коллекция задач, которая сейчас выполняется в текущем контексте, в состоянии активной отмены (или вскоре).Returns an indication of whether the task collection which is currently executing inline on the current context is in the midst of an active cancellation (or will be shortly).
иссинчронауслиблоккедIsSynchronouslyBlocked Определяет, является ли контекст синхронно заблокированным.Determines whether or not the context is synchronously blocked. Контекст считается синхронно заблокированным, если он явно выполнил действие, которое привело к блокировке.A context is considered to be synchronously blocked if it explicitly performed an action which led to blocking.
Превысить предел подписокOversubscribe Внедряет дополнительный виртуальный процессор в планировщик на время выполнения блока кода при вызове в контексте, выполняемом на одном из виртуальных процессоров в этом планировщике.Injects an additional virtual processor into a scheduler for the duration of a block of code when invoked on a context executing on one of the virtual processors in that scheduler.
счедулеграупидScheduleGroupId Возвращает идентификатор для группы расписаний, над которой работает текущий контекст.Returns an identifier for the schedule group that the current context is working on.
ВнестиUnblock Разблокирует контекст и приводит к его готовности к запуску.Unblocks the context and causes it to become runnable.
виртуалпроцессоридVirtualProcessorId Возвращает идентификатор виртуального процессора, на котором исполняется текущий контекст.Returns an identifier for the virtual processor that the current context is executing on.
ПолучаетYield Уступает выполнение, чтобы мог выполняться другой контекст.Yields execution so that another context can execute. Если доступных контекстов для уступки выполнения нет, планировщик может уступить выполнение другому потоку операционной системы.If no other context is available to yield to, the scheduler can yield to another operating system thread.

КомментарииRemarks

Планировщик среда выполнения с параллелизмом (см. раздел планировщик) использует контексты выполнения для выполнения работы, поставленной в очередь приложением.The Concurrency Runtime scheduler (see Scheduler) uses execution contexts to execute the work queued to it by your application. Поток Win32 — это пример контекста выполнения в операционной системе Windows.A Win32 thread is an example of an execution context on a Windows operating system.

В любое время уровень параллелизма планировщика равен числу виртуальных процессоров, предоставленных ему диспетчер ресурсов.At any time, the concurrency level of a scheduler is equal to the number of virtual processors granted to it by the Resource Manager. Виртуальный процессор является абстракцией для обрабатывающего ресурса и сопоставляется аппаратному потоку в базовой системе.A virtual processor is an abstraction for a processing resource and maps to a hardware thread on the underlying system. Только один контекст планировщика может выполняться на виртуальном процессоре в определенный момент времени.Only a single scheduler context can execute on a virtual processor at a given time.

По сути, планировщик работает совместно, и выполняющийся контекст может в любое время передавать свой виртуальный процессор другому контексту, если он хочет перейти в состояние ожидания.The scheduler is cooperative in nature and an executing context can yield its virtual processor to a different context at any time if it wishes to enter a wait state. Когда оно будет удовлетворено, оно не сможет возобновиться, пока доступный виртуальный процессор от планировщика не начнет его выполнение.When its wait it satisfied, it cannot resume until an available virtual processor from the scheduler begins executing it.

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

Context

ТребованияRequirements

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

Пространство имен: параллелизмNamespace: concurrency

БлокBlock

Блокирует текущий контекст.Blocks the current context.

static void __cdecl Block();

КомментарииRemarks

В результате этого метода в процессе будет создан планировщик по умолчанию и/или присоединен к вызывающему контексту, если отсутствует планировщик, в данный момент связанный с вызывающим контекстом.This method will result in the process' default scheduler being created and/or attached to the calling context if there is no scheduler currently associated with the calling context.

Если вызывающий контекст выполняется на виртуальном процессоре, виртуальный процессор обнаружит еще один запускаемый контекст для выполнения или может создать новый.If the calling context is running on a virtual processor, the virtual processor will find another runnable context to execute or can potentially create a new one.

После Block вызова или вызова метода необходимо связать его с вызовом метода Unblock из другого контекста выполнения, чтобы он снова выполнялся.After the Block method has been called or will be called, you must pair it with a call to the Unblock method from another execution context in order for it to run again. Имейте в виду, что существует критически важный период между точкой, в которой код публикует свой контекст для другого потока, чтобы иметь возможность вызвать Unblock метод и точку, в которой был выполнен фактический вызов метода Block .Be aware that there is a critical period between the point where your code publishes its context for another thread to be able to call the Unblock method and the point where the actual method call to Block is made. Во время этого периода не следует вызывать ни один метод, который может блокировать и разблокировать по своим собственным причинам (например, получение блокировки).During this period, you must not call any method which can in turn block and unblock for its own reasons (for example, acquiring a lock). Вызовы Block Unblock метода и не отписывают причину блокировки и разблокировки.Calls to the Block and Unblock method do not track the reason for the blocking and unblocking. Владельцем пары должен быть только один объект Block - Unblock .Only one object should have ownership of a Block- Unblock pair.

Этот метод может вызывать различные исключения, в том числе scheduler_resource_allocation_error.This method can throw a variety of exceptions, including scheduler_resource_allocation_error.

~ Context~Context

virtual ~Context();

CurrentContextCurrentContext

Возвращает указатель на текущий контекст.Returns a pointer to the current context.

static Context* __cdecl CurrentContext();

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

Указатель на текущий контекст.A pointer to the current context.

КомментарииRemarks

В результате этого метода в процессе будет создан планировщик по умолчанию и/или присоединен к вызывающему контексту, если отсутствует планировщик, в данный момент связанный с вызывающим контекстом.This method will result in the process' default scheduler being created and/or attached to the calling context if there is no scheduler currently associated with the calling context.

GetIdGetId

Возвращает идентификатор для контекста, уникального внутри планировщика, которому принадлежит контекст.Returns an identifier for the context that is unique within the scheduler to which the context belongs.

virtual unsigned int GetId() const = 0;

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

Идентификатор контекста, уникальный в пределах планировщика, которому принадлежит контекст.An identifier for the context that is unique within the scheduler to which the context belongs.

жетсчедулеграупидGetScheduleGroupId

Возвращает идентификатор для группы расписаний, над которой в данный момент работает контекст.Returns an identifier for the schedule group that the context is currently working on.

virtual unsigned int GetScheduleGroupId() const = 0;

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

Идентификатор группы расписаний, в которой сейчас работает контекст.An identifier for the schedule group the context is currently working on.

КомментарииRemarks

Возвращаемое значение этого метода — это выборка для группы расписаний, на которой выполняются контекст.The return value from this method is an instantaneous sampling of the schedule group that the context is executing on. Если этот метод вызывается в контексте, отличном от текущего контекста, значение может быть устаревшим в момент возврата и полагаться на него нельзя.If this method is called on a context other than the current context, the value can be stale the moment it is returned and cannot be relied upon. Как правило, этот метод используется только в целях отладки или трассировки.Typically, this method is used for debugging or tracing purposes only.

жетвиртуалпроцессоридGetVirtualProcessorId

Возвращает идентификатор виртуального процессора, на котором в данный момент выполняется контекст.Returns an identifier for the virtual processor that the context is currently executing on.

virtual unsigned int GetVirtualProcessorId() const = 0;

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

Если контекст в данный момент выполняется на виртуальном процессоре, идентификатор виртуального процессора, на котором в данный момент выполняется контекст; в противном случае — значение -1 .If the context is currently executing on a virtual processor, an identifier for the virtual processor that the context is currently executing on; otherwise, the value -1.

КомментарииRemarks

Возвращаемое значение этого метода — это выборка для виртуального процессора, на котором выполняются контекст.The return value from this method is an instantaneous sampling of the virtual processor that the context is executing on. Это значение может быть устаревшим в момент возврата, и на него нельзя полагаться.This value can be stale the moment it is returned and cannot be relied upon. Как правило, этот метод используется только в целях отладки или трассировки.Typically, this method is used for debugging or tracing purposes only.

УдостоверенияId

Возвращает идентификатор для текущего контекста, уникального в пределах планировщика, к которому принадлежит текущий контекст.Returns an identifier for the current context that is unique within the scheduler to which the current context belongs.

static unsigned int __cdecl Id();

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

Если текущий контекст присоединен к планировщику, идентификатор текущего контекста, уникальный в пределах планировщика, к которому принадлежит текущий контекст; в противном случае — значение -1 .If the current context is attached to a scheduler, an identifier for the current context that is unique within the scheduler to which the current context belongs; otherwise, the value -1.

искурренттаскколлектионканцелингIsCurrentTaskCollectionCanceling

Возвращает значение, указывающее, находится ли коллекция задач, которая сейчас выполняется в текущем контексте, в состоянии активной отмены (или вскоре).Returns an indication of whether the task collection which is currently executing inline on the current context is in the midst of an active cancellation (or will be shortly).

static bool __cdecl IsCurrentTaskCollectionCanceling();

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

Если планировщик присоединен к вызывающему контексту, а группа задач исполняет задачу в этом контексте, указывает, находится ли эта группа задач в состоянии активной отмены (или будет вскоре); в противном случае — значение false .If a scheduler is attached to the calling context and a task group is executing a task inline on that context, an indication of whether that task group is in the midst of an active cancellation (or will be shortly); otherwise, the value false.

иссинчронауслиблоккедIsSynchronouslyBlocked

Определяет, является ли контекст синхронно заблокированным.Determines whether or not the context is synchronously blocked. Контекст считается синхронно заблокированным, если он явно выполнил действие, которое привело к блокировке.A context is considered to be synchronously blocked if it explicitly performed an action which led to blocking.

virtual bool IsSynchronouslyBlocked() const = 0;

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

Указывает, синхронно ли блокируется контекст.Whether the context is synchronously blocked.

КомментарииRemarks

Контекст считается синхронно заблокированным, если он явно выполнил действие, которое привело к блокировке.A context is considered to be synchronously blocked if it explicitly performed an action which led to blocking. В планировщике потоков это означает прямой вызов метода Context::Block или объекта синхронизации, который был создан с помощью метода Context::Block.On the thread scheduler, this would indicate a direct call to the Context::Block method or a synchronization object which was built using the Context::Block method.

Возвращаемое значение этого метода — это мгновенное указание того, блокируется ли контекст синхронно.The return value from this method is an instantaneous sample of whether the context is synchronously blocked. Это значение может быть устаревшим, когда оно возвращается и может использоваться только в особых обстоятельствах.This value may be stale the moment it is returned and can only be used under very specific circumstances.

оператор DELETEoperator delete

ContextОбъект внутренне уничтожается средой выполнения.A Context object is destroyed internally by the runtime. Его невозможно удалить явно.It can not be explicitly deleted.

void operator delete(void* _PObject);

ПараметрыParameters

_PObject_PObject
Указатель на удаляемый объект.A pointer to the object to be deleted.

Превысить предел подписокOversubscribe

Внедряет дополнительный виртуальный процессор в планировщик на время выполнения блока кода при вызове в контексте, выполняемом на одном из виртуальных процессоров в этом планировщике.Injects an additional virtual processor into a scheduler for the duration of a block of code when invoked on a context executing on one of the virtual processors in that scheduler.

static void __cdecl Oversubscribe(bool _BeginOversubscription);

ПараметрыParameters

_BeginOversubscription_BeginOversubscription
Значение true указывает, что дополнительный виртуальный процессор следует добавить в течение превышения лимита подписки.If true, an indication that an extra virtual processor should be added for the duration of the oversubscription. Значение false указывает, что превышение лимита подписки должно завершиться, а ранее добавленный виртуальный процессор должен быть удален.If false, an indication that the oversubscription should end and the previously added virtual processor should be removed.

счедулеграупидScheduleGroupId

Возвращает идентификатор для группы расписаний, над которой работает текущий контекст.Returns an identifier for the schedule group that the current context is working on.

static unsigned int __cdecl ScheduleGroupId();

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

Если текущий контекст присоединен к планировщику и работает над группой расписаний, идентификатор группы планировщика, на котором работает текущий контекст; в противном случае — значение -1 .If the current context is attached to a scheduler and working on a schedule group, an identifier for the scheduler group that the current context is working on; otherwise, the value -1.

ВнестиUnblock

Разблокирует контекст и приводит к его готовности к запуску.Unblocks the context and causes it to become runnable.

virtual void Unblock() = 0;

КомментарииRemarks

Вполне допустимо обращаться к Unblock методу перед соответствующим вызовом метода Block .It is perfectly legal for a call to the Unblock method to come before a corresponding call to the Block method. При условии, что вызовы Block Unblock методов и правильно парны, среда выполнения правильно обрабатывает естественную конкуренцию любого порядка.As long as calls to the Block and Unblock methods are properly paired, the runtime properly handles the natural race of either ordering. UnblockВызов, идущий перед Block вызовом, просто инвертирует результат Block вызова.An Unblock call coming before a Block call simply negates the effect of the Block call.

Существует несколько исключений, которые могут быть вызваны из этого метода.There are several exceptions which can be thrown from this method. Если контекст пытается вызвать Unblock метод на самом себе, будет выдано исключение context_self_unblock .If a context attempts to call the Unblock method on itself, a context_self_unblock exception will be thrown. Если вызовы Block и Unblock не связаны должным образом (например, два вызова выполняются Unblock для контекста, который сейчас выполняется), будет создано исключение context_unblock_unbalanced .If calls to Block and Unblock are not properly paired (for example, two calls to Unblock are made for a context which is currently running), a context_unblock_unbalanced exception will be thrown.

Имейте в виду, что существует критически важный период между точкой, в которой код публикует свой контекст для другого потока, чтобы иметь возможность вызвать Unblock метод и точку, в которой был выполнен фактический вызов метода Block .Be aware that there is a critical period between the point where your code publishes its context for another thread to be able to call the Unblock method and the point where the actual method call to Block is made. Во время этого периода не следует вызывать ни один метод, который может блокировать и разблокировать по своим собственным причинам (например, получение блокировки).During this period, you must not call any method which can in turn block and unblock for its own reasons (for example, acquiring a lock). Вызовы Block Unblock метода и не отписывают причину блокировки и разблокировки.Calls to the Block and Unblock method do not track the reason for the blocking and unblocking. Только один объект должен иметь право собственности на Block Unblock пару и.Only one object should have ownership of a Block and Unblock pair.

виртуалпроцессоридVirtualProcessorId

Возвращает идентификатор виртуального процессора, на котором исполняется текущий контекст.Returns an identifier for the virtual processor that the current context is executing on.

static unsigned int __cdecl VirtualProcessorId();

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

Если текущий контекст присоединен к планировщику, идентификатор виртуального процессора, на котором выполняются текущие контексты; в противном случае — значение -1 .If the current context is attached to a scheduler, an identifier for the virtual processor that the current context is executing on; otherwise, the value -1.

КомментарииRemarks

Возвращаемое значение этого метода — это выборка мгновенного значения виртуального процессора, на котором выполняются текущие контексты.The return value from this method is an instantaneous sampling of the virtual processor that the current context is executing on. Это значение может быть устаревшим в момент возврата, и на него нельзя полагаться.This value can be stale the moment it is returned and cannot be relied upon. Как правило, этот метод используется только в целях отладки или трассировки.Typically, this method is used for debugging or tracing purposes only.

ПолучаетYield

Уступает выполнение, чтобы мог выполняться другой контекст.Yields execution so that another context can execute. Если доступных контекстов для уступки выполнения нет, планировщик может уступить выполнение другому потоку операционной системы.If no other context is available to yield to, the scheduler can yield to another operating system thread.

static void __cdecl Yield();

КомментарииRemarks

В результате этого метода в процессе будет создан планировщик по умолчанию и/или присоединен к вызывающему контексту, если отсутствует планировщик, в данный момент связанный с вызывающим контекстом.This method will result in the process' default scheduler being created and/or attached to the calling context if there is no scheduler currently associated with the calling context.

YieldExecutionYieldExecution

Уступает выполнение, чтобы мог выполняться другой контекст.Yields execution so that another context can execute. Если доступных контекстов для уступки выполнения нет, планировщик может уступить выполнение другому потоку операционной системы.If no other context is available to yield to, the scheduler can yield to another operating system thread.

static void __cdecl YieldExecution();

КомментарииRemarks

В результате этого метода в процессе будет создан планировщик по умолчанию и/или присоединен к вызывающему контексту, если отсутствует планировщик, в данный момент связанный с вызывающим контекстом.This method will result in the process' default scheduler being created and/or attached to the calling context if there is no scheduler currently associated with the calling context.

Эта функция является новой в Visual Studio 2015 и идентична функции yield , но не конфликтует с макросом yield в Windows. h.This function is new in Visual Studio 2015 and is identical to the Yield function but does not conflict with the Yield macro in Windows.h.

См. также разделSee also

Пространство имен Concurrencyconcurrency Namespace
Класс SchedulerScheduler Class
Планировщик заданийTask Scheduler