IThreadProxy::SwitchTo 方法
执行从当前执行上下文到另一个上下文的协作上下文切换。
virtual void SwitchTo(
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。
要求
**标头:**concrtrm.h
命名空间: 并发