IVirtualProcessorRoot 结构
线程代理可在其中执行的硬件线程的抽象。
语法
struct IVirtualProcessorRoot : public IExecutionResource;
成员
公共方法
名称 | 描述 |
---|---|
IVirtualProcessorRoot::Activate | 导致与执行上下文接口 pContext 关联的线程代理开始在此虚拟处理器根上执行。 |
IVirtualProcessorRoot::Deactivate | 导致当前在此虚拟处理器根上执行的线程代理停止调度执行上下文。 线程代理将在调用 Activate 方法时继续执行。 |
IVirtualProcessorRoot::EnsureAllTasksVisible | 导致单个处理器的内存层次结构中存储的数据对系统中的所有处理器均可见。 它可确保在该方法返回之前已在所有处理器上执行了完整内存隔离。 |
IVirtualProcessorRoot::GetId | 返回虚拟处理器根的唯一标识符。 |
备注
每个虚拟处理器根都有关联的执行资源。 IVirtualProcessorRoot
接口继承自 IExecutionResource 接口。 可能会有多个虚拟处理器根对应于同一个基础硬件线程。
在响应对资源的请求时,资源管理器将虚拟处理器根授予计划程序。 通过使用执行上下文来激活虚拟处理器根,计划程序可以使用虚拟处理器根来执行工作。
继承层次结构
IVirtualProcessorRoot
要求
标头:concrtrm.h
命名空间: 并发
IVirtualProcessorRoot::Activate 方法
导致与执行上下文接口 pContext
关联的线程代理开始在此虚拟处理器根上执行。
virtual void Activate(_Inout_ IExecutionContext* pContext) = 0;
参数
pContext
将在此虚拟处理器根上调度的执行上下文的接口。
注解
如果某线程代理未关联执行上下文接口 pContext
,则资源管理器将提供该代理
可使用 Activate
方法开始在资源管理器返回的新虚拟处理器根上执行工作,或恢复已停用或即将停用的虚拟处理器根上的线程代理。 有关停用的详细信息,请参阅 IVirtualProcessorRoot::Deactivate。 恢复停用的虚拟处理器根时,参数 pContext
必须与停用虚拟处理器根时所用参数相同。
第一次激活虚拟处理器根后,对 Deactivate
和 Activate
的后续调用之间可能会出现相互争用的情况。 这意味着,资源管理器在本应接收到 Deactivate
调用之前接收到 Activate
调用是可以接受的。
激活虚拟处理器根时,会向资源管理器发出信号,指示此虚拟处理器根当前处于忙碌状态。 如果计划程序找不到任何要在此根上执行的工作,则预期应调用 Deactivate
方法,向资源管理器告知,虚拟处理器根处于空闲状态。 资源管理器使用此数据实现系统的负载均衡。
如果参数 pContext
具有值 NULL
,则会引发 invalid_argument
。
如果参数 pContext
不表示此虚拟处理器根最近分派的执行上下文,则引发 invalid_operation
。
激活虚拟处理器根这一行为会将基础硬件线程的订阅级别提高一级。 有关订阅级别的详细信息,请参阅 IExecutionResource::CurrentSubscriptionLevel。
IVirtualProcessorRoot::Deactivate 方法
导致当前在此虚拟处理器根上执行的线程代理停止调度执行上下文。 线程代理将在调用 Activate
方法时继续执行。
virtual bool Deactivate(_Inout_ IExecutionContext* pContext) = 0;
参数
pContext
此根当前正在指派的上下文。
返回值
一个布尔值。 值 true
指示在响应对 Activate
方法的调用时线程代理从 Deactivate
方法返回。 值 false
指示在响应资源管理器中的通知事件时,线程代理从该方法返回。 在用户模式可计划 (UMS) 线程计划程序中,这指示相关项已显示在计划程序的完成列表中,且需要计划程序来处理这些项。
备注
如果在计划程序中找不到任何工作,则使用此方法来暂时停止执行虚拟处理器根。 对 Deactivate
方法的调用必须源自上次激活虚拟处理器根时的执行上下文中的 Dispatch
方法。 换句话说,调用 Deactivate
方法的线程代理必须是当前在虚拟处理器根上执行的线程代理。 在未执行的虚拟处理器根上调用该方法可能会导致未定义的行为。
停用的虚拟处理器根可能可通过对 Activate
方法的调用来唤醒,该调用使用传递给 Deactivate
方法的相同参数。 计划程序负责确保对 Activate
方法和 Deactivate
方法的调用匹配,但不要求按特定顺序接收它们。 资源管理器可以在本应接收的对 Activate
方法的调用之前处理对 Deactivate
方法的调用。
如果虚拟处理器根被唤醒且来自 Deactivate
方法的返回值为值 false
,则计划程序应通过 IUMSCompletionList::GetUnblockNotifications
方法查询 UMS 完成列表,对该信息执行操作,然后再次调用 Deactivate
方法。 应重复此过程,直至 Deactivate
方法返回值 true
。
如果参数 pContext
具有值 NULL,则会引发 invalid_argument
。
如果从未激活虚拟处理器根,或参数 pContext
不表示此虚拟处理器根最新分派的执行上下文,则引发 invalid_operation
。
停用虚拟处理器根这一行为会将基础硬件线程的订阅级别降低一级。 有关订阅级别的详细信息,请参阅 IExecutionResource::CurrentSubscriptionLevel。
IVirtualProcessorRoot::EnsureAllTasksVisible 方法
导致单个处理器的内存层次结构中存储的数据对系统中的所有处理器均可见。 它可确保在该方法返回之前已在所有处理器上执行了完整内存隔离。
virtual void EnsureAllTasksVisible(_Inout_ IExecutionContext* pContext) = 0;
参数
pContext
此虚拟处理器根当前正在调度的上下文。
备注
如果想要将虚拟处理器根的停用与向计划程序添加新工作同步,可能会发现此方法很有用。 出于性能原因,你可能会决定在不执行内存屏障的情况下将工作项添加到计划程序,这意味着由正在某个处理器上执行的线程所添加的工作项对所有其他处理器不是直接可见的。 通过将此方法与 Deactivate
方法结合使用,可以确保当工作项存在于计划程序的集合中时计划程序不会停用其所有虚拟处理器根。
对 EnsureAllTasksVisibleThe
方法的调用必须源自上次激活虚拟处理器根时的执行上下文中的 Dispatch
方法。 换句话说,调用 EnsureAllTasksVisible
方法的线程代理必须是当前在虚拟处理器根上执行的线程代理。 在未执行的虚拟处理器根上调用该方法可能会导致未定义的行为。
如果参数 pContext
具有值 NULL
,则会引发 invalid_argument
。
如果从未激活虚拟处理器根,或参数 pContext
不表示此虚拟处理器根最新分派的执行上下文,则引发 invalid_operation
。
IVirtualProcessorRoot::GetId Method
返回虚拟处理器根的唯一标识符。
virtual unsigned int GetId() const = 0;
返回值
一个整数标识符。