从基础虚拟处理器分离上下文。
virtual void SwitchOut(
SwitchingProxyState switchState = Blocking
) =0;
参数
- switchState
表示正在执行切换的线程代理的状态。 该参数的类型为 SwitchingProxyState。
备注
使用 SwitchOut,如果任何原因,需要从它执行的虚拟处理器的根的分离上下文。 根据传递到参数 switchState的值以及它是否在虚拟处理器根执行,调用将立即返回或阻塞与上下文关联线程代理。 使用Idle的参数集合调用 SwitchOut 是一个的错误 。 这样做将导致 invalid_argument 异常。
当您要减少您的计划程序拥有的虚拟处理器根的数目,原因是资源管理器让您如此,或者是您请求临时过度订阅虚拟处理器根,并且已完成,SwitchOut有用。 在这种情况下应在用Blocking的参数 switchState 的集合调用SwitchOut 之前调用在虚拟处理器根的方法 IVirtualProcessorRoot::Remove Method 。 这将阻塞线程代理并且当不同的虚拟处理器根在调度程序中可执行它时,线程代理可以继续执行。 对于正在阻塞的线程代理,可以通过调用函数 SwitchTo 切换到此线程代理的执行上下文来继续该代理。 还可以通过使用线程代理相关的上下文来激活虚拟处理器根。 有关如何执行此操作的更多信息,请参见 IVirtualProcessorRoot::Activate。
希望重新初始化虚拟处理器时,SwitchOut可能被使用,因此可能在将来激活该功能,当阻塞线程代理或临时解除它从其运行该计划作业的虚拟处理器的根时进入计划程序。 如果您希望阻止线程代理,请使用与参数 switchState 的 SwitchOut 设置为 Blocking。 它可以使用 SwitchTo 或 IVirtualProcessorRoot::Activate在以后恢复, 如上所示。 请使用参数的 SwitchOut 设置为 Nesting,当您想要从运行它的虚拟处理器根暂时分离线程代理时和与虚拟处理器关联的计划程序。 使用参数调用 switchState 的 SwitchOut 设置为 Nesting,当在虚拟处理器根执行时将导致根重新初始化和当前线程代理在没有一个的需要情况下继续执行。 线程代理被视为已离开计划程序,直到它稍后用Blocking调用 IThreadProxy::SwitchOut 方法。 第二次调用具有参数的 SwitchOut 设置为 Blocking 预期返回一个阻塞状态上下文,以便可以通过它分离的 SwitchTo 或 IVirtualProcessorRoot::Activate 还原该计划程序。 由于它不在虚拟处理器根中执行,再次预装不会发生。
重新初始化的虚拟处理器根与资源管理器授予您的计划程序的全新的虚拟处理器根相同。 可以为执行通过用使用 IVirtualProcessorRoot::Activate的执行上下文激活它的方法来使用它。
必须在 IThreadProxy 接口上调用 SwitchOut,该值表示当前正在执行的线程或结果是未定义的。
在随 Visual Studio 2010 的库和标头,此方法不接受参数,而不是重新初始化虚拟处理器根。 为了保留旧的行为,Blocking默认的参数值被提供。
要求
**标头:**concrtrm.h
**命名空间:**并发