IExecutionResource 结构
硬件线程的抽象。
语法
struct IExecutionResource;
成员
公共方法
名称 | 描述 |
---|---|
IExecutionResource::CurrentSubscriptionLevel | 返回当前与此执行资源所代表的底层硬件线程关联的已激活虚拟处理器根数和订阅的外部线程数。 |
IExecutionResource::GetExecutionResourceId | 返回此执行资源所代表的硬件线程的唯一标识符。 |
IExecutionResource::GetNodeId | 返回此执行资源所属的处理器节点的唯一标识符。 |
IExecutionResource::Remove | 将此执行资源返回给资源管理器。 |
注解
执行资源可以是独立的,也可以与虚拟处理器根相关联。 当应用程序中的线程创建线程订阅时,将创建独立的执行资源。 ISchedulerProxy::SubscribeThread 和 ISchedulerProxy::RequestInitialVirtualProcessors 方法创建线程订阅,并返回一个表示订阅的 IExecutionResource
接口。 创建线程订阅是一种通知资源管理器有关以下信息的方法,即给定线程将参与排队到计划程序的工作,以及排队到资源管理器分配给计划程序的虚拟处理器根的工作。 资源管理器使用该信息来尽可能避免过度订阅硬件线程。
继承层次结构
IExecutionResource
要求
标头:concrtrm.h
命名空间: 并发
IExecutionResource::CurrentSubscriptionLevel Method
返回当前与此执行资源所代表的底层硬件线程关联的已激活虚拟处理器根数和订阅的外部线程数。
virtual unsigned int CurrentSubscriptionLevel() const = 0;
返回值
当前订阅级别。
备注
订阅级别告知与硬件线程关联的正在运行的线程数。 这仅包括资源管理器以订阅线程的形式识别的线程,以及正在主动执行线程代理的虚拟处理器根。
调用方法 ISchedulerProxy::SubscribeCurrentThread 或方法 ISchedulerProxy::RequestInitialVirtualProcessors 并将参数 doSubscribeCurrentThread
设置为值 true
会将硬件线程的订阅级别增加一级。 它们还会返回一个表示订阅的 IExecutionResource
接口。 对 IExecutionResource::Remove 的相应调用会将硬件线程的订阅级别减少一级。
使用方法 IVirtualProcessorRoot::Activate 激活虚拟处理器根的行为会将硬件线程的订阅级别增加一级。 当在激活的虚拟处理器根上调用时,方法 IVirtualProcessorRoot::Deactivate 或 IExecutionResource::Remove 会将订阅级别减少一级。
资源管理器使用订阅级别信息作为确定何时在计划程序之间移动资源的方法之一。
IExecutionResource::GetExecutionResourceId 方法
返回此执行资源所代表的硬件线程的唯一标识符。
virtual unsigned int GetExecutionResourceId() const = 0;
返回值
此执行资源下的硬件线程的唯一标识符。
备注
并发运行时为每个硬件线程分配一个唯一标识符。 如果多个执行资源关联硬件线程,它们都将具有相同的执行资源标识符。
IExecutionResource::GetNodeId 方法
返回此执行资源所属的处理器节点的唯一标识符。
virtual unsigned int GetNodeId() const = 0;
返回值
处理器节点的唯一标识符。
备注
并发运行时以处理器节点组的形式表示系统上的硬件线程。 节点通常派生自系统的硬件拓扑。 例如,特定套接字或特定 NUMA 节点上的所有处理器可能属于同一处理器节点。 资源管理器为这些节点分配唯一标识符,从 0
开始到(并且包含)nodeCount - 1
,其中 nodeCount
表示系统上处理器节点的总数。
可以从函数 GetProcessorNodeCount 获取节点计数。
IExecutionResource::Remove 方法
将此执行资源返回给资源管理器。
virtual void Remove(_Inout_ IScheduler* pScheduler) = 0;
参数
pScheduler
请求删除此执行资源的计划程序的接口。
注解
使用此方法可将独立执行资源以及与虚拟处理器根关联的执行资源返回给资源管理器。
如果这是从 ISchedulerProxy::SubscribeCurrentThread 或 ISchedulerProxy::RequestInitialVirtualProcessors 方法之一收到的独立执行资源,则调用方法 Remove
将结束创建资源表示的线程订阅。 需要在关闭计划程序代理之前结束所有线程订阅,并且必须从创建订阅的线程调用 Remove
。
虚拟处理器根也可返回至资源管理器,通过调用 Remove
方法实现,因为接口 IVirtualProcessorRoot
继承自 IExecutionResource
接口。 可能需要返回虚拟处理器根以响应对 IScheduler::RemoveVirtualProcessors 方法的调用,或者完成从 ISchedulerProxy::CreateOversubscriber 方法获得的超额订阅虚拟处理器根时返回。 对于虚拟处理器根,没有限制线程对 Remove
方法的调用。
如果参数 pScheduler
设置为 NULL
,则引发 invalid_argument
。
如果参数 pScheduler
与为其创建此执行资源的计划程序不同,或者对于独立执行资源,如果当前线程与创建线程订阅的线程不同,则引发 invalid_operation
。