Share via


IThreadProxy 结构

执行线程的抽象。 根据你创建的计划程序的 SchedulerType 策略键,资源管理器将授予你由普通的 Win32 线程或用户模式计划 (UMS) 线程支持的线程代理。 UMS 线程在具有 Windows 7 或更高版本的 64 位操作系统上受到支持。

语法

struct IThreadProxy;

成员

公共方法

名称 描述
IThreadProxy::GetId 返回线程代理的唯一标识符。
IThreadProxy::SwitchOut 解除上下文与基础虚拟处理器根的关联。
IThreadProxy::SwitchTo 执行从当前执行上下文到另一个上下文的协作上下文切换。
IThreadProxy::YieldToSystem 导致调用线程执行准备好在当前处理器上运行的另一个线程。 操作系统选择下一个要执行的线程。

备注

线程代理与接口 IExecutionContext 表示的执行上下文耦合,作为调度工作的一种方法。

继承层次结构

IThreadProxy

要求

标头:concrtrm.h

命名空间: 并发

IThreadProxy::GetId 方法

返回线程代理的唯一标识符。

virtual unsigned int GetId() const = 0;

返回值

唯一的整数标识符。

IThreadProxy::SwitchOut 方法

解除上下文与基础虚拟处理器根的关联。

virtual void SwitchOut(SwitchingProxyState switchState = Blocking) = 0;

参数

switchState
指示正在执行切换的线程代理的状态。 该参数的类型为 SwitchingProxyState

备注

如果由于某种原因需要解除上下文与执行它的虚拟处理器根的关联,请使用 SwitchOut。 根据传入参数 switchState的值,以及它是否在虚拟处理器根上执行,此调用将立即返回或阻塞与上下文关联的线程代理。 调用将参数设置为 SwitchOutIdle 是错误的。 这样做将导致 invalid_argument 异常。

当您因资源管理器指示或是请求了临时过度订阅的虚拟处理器根,而要减少计划程序所拥有的虚拟处理器根的数量,并且已完成时,SwitchOut 很有用。 在这种情况下,应在调用 SwitchOut 并将参数 switchState 设置为 Blocking 之前,在虚拟处理器根上调用方法 IVirtualProcessorRoot::Remove。 这将阻塞线程代理,并且当计划程序中不同的虚拟处理器根可用来执行它时,线程代理将继续执行。 可以通过调用函数 SwitchTo 切换到此线程代理的执行上下文来继续执行阻塞线程代理。 还可以通过使用其关联的上下文激活虚拟处理器根来继续执行线程代理。 有关如何执行此操作的详细信息,请参阅 IVirtualProcessorRoot::Activate

如果您希望重新初始化虚拟处理器,也可以使用 SwitchOut,这样在将来阻塞线程代理或从运行它的虚拟处理器根和它进行调度工作的计划程序暂时分离该线程代理时,可以将虚拟处理器激活。 如果您希望阻塞线程代理,请使用 SwitchOut 并将参数 switchState 设置为 Blocking。 如上所示,稍后可以使用 SwitchToIVirtualProcessorRoot::Activate 将其恢复。 当您想要将该线程代理从运行它的虚拟处理器根和与虚拟处理器关联的计划程序暂时分离时,请使用 SwitchOut 并将参数设置为 Nesting。 当线程代理在虚拟处理器根上执行时,调用 SwitchOut 并将参数 switchState 设置为 Nesting 将导致根重新初始化,而当前线程代理无需虚拟处理器根也会继续执行。 线程代理被视为已离开计划程序,直到它在稍后的某个时间点用 Blocking 调用 IThreadProxy::SwitchOut 方法。 对将参数设置为 SwitchOutBlocking 的第二次调用旨在使上下文返回已阻止状态,以便通过 SwitchToIVirtualProcessorRoot::Activate 在之前与其分离的计划程序中恢复它。 由于它不是在虚拟处理器根上执行的,因此不会发生重新初始化。

重新初始化后的虚拟处理器根与资源管理器授予您的计划程序的全新虚拟处理器根没有任何不同。 您可以使用 IVirtualProcessorRoot::Activate,通过一个执行上下文来激活它,将其用于执行。

必须在表示当前执行的线程或结果未定义的接口上 IThreadProxy 调用 SwitchOut

在随 Visual Studio 2010 一同提供的库和标头中,此方法未采用参数,而且没有重新初始化虚拟处理器根。 为了保留旧行为,提供 Blocking 的默认参数值。

IThreadProxy::SwitchTo 方法

执行从当前执行上下文到另一个上下文的协作上下文切换。

virtual void SwitchTo(
    _Inout_ IExecutionContext* pContext,
    SwitchingProxyState switchState) = 0;

参数

pContext
要协作切换到的执行上下文。

switchState
指示正在执行切换的线程代理的状态。 该参数的类型为 SwitchingProxyState

备注

使用此方法根据第一个执行上下文的 IExecutionContext::Dispatch 方法从一个执行上下文切换到另一个。 如果执行上下文 pContext 尚未与线程代理相关联,则该方法会将其与线程代理相关联。 当前线程代理的所有权由为 switchState 参数指定的值决定。

如果要将当前执行的线程代理返回给资源管理器,请使用值 Idle。 在将参数 switchState 设置为 Idle 的情况下调用 SwitchTo 将导致执行上下文 pContext 开始在底层执行资源上执行。 此线程代理的所有权将转让给资源管理器,并且你应在 SwitchTo 返回后不久从执行上下文的 Dispatch 方法返回,以完成转让。 线程代理调度的执行上下文与线程代理解除关联,计划程序可以自由地重用它或在合适时销毁它。

如果希望此线程代理进入阻塞状态,请使用值 Blocking。 在将参数 switchState 设置为 Blocking 的情况下调用 SwitchTo 将导致执行上下文 pContext 开始执行,并阻止当前线程代理,直到继续执行该线程代理。 线程代理处于 Blocking 状态时,计划程序保留线程代理的所有权。 可以通过调用函数 SwitchTo 切换到此线程代理的执行上下文来继续执行阻塞线程代理。 还可以通过使用其关联的上下文激活虚拟处理器根来继续执行线程代理。 有关如何执行此操作的详细信息,请参阅 IVirtualProcessorRoot::Activate

想要将此线程代理从运行它的虚拟处理器根和它正在为其分派工作的计划程序暂时分离时,请使用值 Nesting。 在将参数 switchState 设置为 Nesting 的情况下调用 SwitchTo 将导致执行上下文 pContext 开始执行,并且当前线程代理也将在无需虚拟处理器根的情况下继续执行。 线程代理被视为已离开计划程序,直到它在稍后的某个时间点用调用 IThreadProxy::SwitchOut 方法。 IThreadProxy::SwitchOut 方法可能会阻塞线程代理,直到可以使用虚拟处理器根对其进行重新计划。

必须在表示当前执行的线程或结果未定义的接口上 IThreadProxy 调用 SwitchTo。 如果参数 pContext 设置为 NULL,该函数将引发 invalid_argument

IThreadProxy::YieldToSystem 方法

导致调用线程执行准备好在当前处理器上运行的另一个线程。 操作系统选择下一个要执行的线程。

virtual void YieldToSystem() = 0;

备注

由常规 Windows 线程支持的线程代理调用时,YieldToSystem 的行为与 Windows 函数 SwitchToThread 的行为完全相同。 但从用户模式计划 (UMS) 线程调用时,SwitchToThread 函数会将选择下一个要运行的线程的任务委托给用户模式计划程序,而不是操作系统。 若要实现在系统中切换为另一个就绪线程的预期效果,请使用 YieldToSystem

必须在表示当前执行的线程或结果未定义的接口上 IThreadProxy 调用 YieldToSystem

另请参阅

并发命名空间
IExecutionContext 结构
IScheduler 结构
IVirtualProcessorRoot 结构