Context 类
表示执行上下文的抽象。
语法
class Context;
成员
受保护构造函数
名称 | 描述 |
---|---|
~Context 析构函数 |
公共方法
名称 | 描述 |
---|---|
阻止 | 阻止当前上下文。 |
CurrentContext | 返回指向当前上下文的指针。 |
GetId | 返回上下文的标识符,该标识符在上下文所属的计划程序中是唯一的。 |
GetScheduleGroupId | 返回上下文当前作用于的计划组的标识符。 |
GetVirtualProcessorId | 返回当前在其上执行上下文的虚拟处理器的标识符。 |
Id | 返回当前上下文的标识符,该标识符在当前上下文所属的计划程序中是唯一的。 |
IsCurrentTaskCollectionCanceling | 返回在当前上下文中内联执行的任务集合是否正处于有效取消的过程中(或不久将取消)的指示。 |
IsSynchronouslyBlocked | 确定是否同步阻止上下文。 如果上下文显式执行导致阻止的操作,则认为同步阻止该上下文。 |
Oversubscribe | 当在计划程序中的某个虚拟处理器上执行的上下文上调用时,在代码块的持续时间向该计划程序注入额外的虚拟处理器。 |
ScheduleGroupId | 返回当前上下文作用于的计划组的标识符。 |
Unblock | 取消阻止上下文并使其可运行。 |
VirtualProcessorId | 返回在其上执行当前上下文的虚拟处理器的标识符。 |
Yield | 让出执行,这样另一个上下文可进行执行。 如果没有其他上下文可接受执行,则计划程序可将执行让出给另一个操作系统线程。 |
注解
并发运行时计划程序(详见计划程序)使用执行上下文来执行应用程序排队的工作。 Win32 线程就是 Windows 操作系统上的一个执行上下文。
在任何时候,计划程序的并发级别都等于资源管理器授予它的虚拟处理器数。 虚拟处理器是处理资源的抽象,映射到基础系统上的硬件线程。 在给定时间,只能在一个虚拟处理器上执行一个计划程序上下文。
计划程序本质上是协作的,如果执行上下文希望进入等待状态,它随时都可将其虚拟处理器交付给其他上下文。 当它等待达到满足状态时,在计划程序中可用的虚拟处理器开始执行它之前,它无法恢复。
继承层次结构
Context
要求
标头:concrt.h
命名空间: 并发
阻止
阻止当前上下文。
static void __cdecl Block();
备注
如果当前没有计划程序与调用上下文关联,此方法将导致进程的默认计划程序正被创建和/或附加到调用上下文。
如果调用上下文在虚拟处理器上运行,该虚拟处理器将查找另一个可运行的上下文来执行,或者可能创建新的上下文。
已经调用或将调用 Block
方法后,必须将其与从另一个执行上下文对 Unblock 方法的调用进行配对,以便它再次运行。 请注意,代码发布其上下文以便另一个线程能够调用 Unblock
方法的点与对 Block
进行实际方法调用的点之间存在一个关键时期。 在此时间段内,您不能调用任何可能会反过来阻止或取消阻止其自身原因(例如获取一个锁)的方法。 对 Block
和 Unblock
方法的调用不会跟踪阻止和取消阻止的原因。 只有一个对象应拥有 Block
- Unblock
对的所有权。
此方法可能引发多种异常,包括 scheduler_resource_allocation_error。
~Context
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
。
注解
此方法的返回值是正在其中执行上下文的虚拟处理器的即时采样。 此值可能在返回时过时并且不可依靠。 通常,此方法仅用于调试或跟踪目的。
Id
返回当前上下文的标识符,该标识符在当前上下文所属的计划程序中是唯一的。
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
指向要删除的对象的指针。
Oversubscribe
当在计划程序中的某个虚拟处理器上执行的上下文上调用时,在代码块的持续时间向该计划程序注入额外的虚拟处理器。
static void __cdecl Oversubscribe(bool _BeginOversubscription);
参数
_BeginOversubscription
如果为 true
,则指示应在过度订阅期间添加额外的虚拟处理器。 如果为 false
,则指示应结束过度订阅并且应删除之前添加的虚拟处理器。
ScheduleGroupId
返回当前上下文作用于的计划组的标识符。
static unsigned int __cdecl ScheduleGroupId();
返回值
如果当前上下文附加到计划程序且正在处理计划组,则返回当前上下文正在作用于的计划程序组的标识符;否则,返回值 -1
。
Unblock
取消阻止上下文并使其可运行。
virtual void Unblock() = 0;
注解
在对 Block 方法进行相应调用之前调用 Unblock
方法是完全合法的。 只要对 Block
和 Unblock
方法的调用正确配对,运行时就能正确处理任一排序的自然争用。 在 Block
调用之前进行 Unblock
调用会抵消 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 函数,但不与 Windows.h 中的 Yield 宏冲突。