IThreadProxy Structure
An abstraction for a thread of execution. Depending on the SchedulerType
policy key of the scheduler you create, the Resource Manager will grant you a thread proxy that is backed by either a regular Win32 thread or a user-mode schedulable (UMS) thread. UMS threads are supported on 64-bit operating systems with version Windows 7 and higher.
Syntax
struct IThreadProxy;
Members
Public Methods
Name | Description |
---|---|
IThreadProxy::GetId | Returns a unique identifier for the thread proxy. |
IThreadProxy::SwitchOut | Disassociates the context from the underlying virtual processor root. |
IThreadProxy::SwitchTo | Performs a cooperative context switch from the currently executing context to a different one. |
IThreadProxy::YieldToSystem | Causes the calling thread to yield execution to another thread that is ready to run on the current processor. The operating system selects the next thread to be executed. |
Remarks
Thread proxies are coupled to execution contexts represented by the interface IExecutionContext
as a means of dispatching work.
Inheritance Hierarchy
IThreadProxy
Requirements
Header: concrtrm.h
Namespace: concurrency
IThreadProxy::GetId Method
Returns a unique identifier for the thread proxy.
virtual unsigned int GetId() const = 0;
Return Value
A unique integer identifier.
IThreadProxy::SwitchOut Method
Disassociates the context from the underlying virtual processor root.
virtual void SwitchOut(SwitchingProxyState switchState = Blocking) = 0;
Parameters
switchState
Indicates the state of the thread proxy that is executing the switch. The parameter is of type SwitchingProxyState
.
Remarks
Use SwitchOut
if you need to disassociate a context from the virtual processor root it is executing on, for any reason. Depending on the value you pass in to the parameter switchState
, and whether or not it is executing on a virtual processor root, the call will either return immediately or block the thread proxy associated with the context. It is an error to call SwitchOut
with the parameter set to Idle
. Doing so will result in an invalid_argument exception.
SwitchOut
is useful when you want to reduce the number of virtual processor roots your scheduler has, either because the Resource Manager has instructed you to do so, or because you requested a temporary oversubscribed virtual processor root, and are done with it. In this case you should invoke the method IVirtualProcessorRoot::Remove on the virtual processor root, before making a call to SwitchOut
with the parameter switchState
set to Blocking
. This will block the thread proxy and it will resume execution when a different virtual processor root in the scheduler is available to execute it. The blocking thread proxy can be resumed by calling the function SwitchTo
to switch to this thread proxy's execution context. You can also resume the thread proxy, by using its associated context to activate a virtual processor root. For more information on how to do this, see IVirtualProcessorRoot::Activate.
SwitchOut
may also be used when you want reinitialize the virtual processor so it may be activated in the future while either blocking the thread proxy or temporarily detaching it from the virtual processor root it is running on, and the scheduler it is dispatching work for. Use SwitchOut
with the parameter switchState
set to Blocking
if you wish to block the thread proxy. It can later be resumed using either SwitchTo
or IVirtualProcessorRoot::Activate
as noted above. Use SwitchOut
with the parameter set to Nesting
when you want to temporarily detach this thread proxy from the virtual processor root it is running on, and the scheduler the virtual processor is associated with. Calling SwitchOut
with the parameter switchState
set to Nesting
while it is executing on a virtual processor root will cause the root to be reinitialized and the current thread proxy to continue executing without the need for one. The thread proxy is considered to have left the scheduler until it calls the IThreadProxy::SwitchOut method with Blocking
at a later point in time. The second call to SwitchOut
with the parameter set to Blocking
is intended to return the context to a blocked state so that it can be resumed by either SwitchTo
or IVirtualProcessorRoot::Activate
in the scheduler it detached from. Because it was not executing on a virtual processor root, no reinitialization takes place.
A reinitialized virtual processor root is no different from a brand new virtual processor root your scheduler has been granted by the Resource Manager. You can use it for execution by activating it with an execution context using IVirtualProcessorRoot::Activate
.
SwitchOut
must be called on the IThreadProxy
interface that represents the currently executing thread or the results are undefined.
In the libraries and headers that shipped with Visual Studio 2010, this method did not take a parameter and did not reinitialize the virtual processor root. To preserve old behavior, the default parameter value of Blocking
is supplied.
IThreadProxy::SwitchTo Method
Performs a cooperative context switch from the currently executing context to a different one.
virtual void SwitchTo(
_Inout_ IExecutionContext* pContext,
SwitchingProxyState switchState) = 0;
Parameters
pContext
The execution context to cooperatively switch to.
switchState
Indicates the state of the thread proxy that is executing the switch. The parameter is of type SwitchingProxyState
.
Remarks
Use this method to switch from one execution context to another, from the IExecutionContext::Dispatch method of the first execution context. The method associates the execution context pContext
with a thread proxy if it is not already associated with one. The ownership of the current thread proxy is determined by the value you specify for the switchState
argument.
Use the value Idle
when you want to return the currently executing thread proxy to the Resource Manager. Calling SwitchTo
with the parameter switchState
set to Idle
will cause the execution context pContext
to start executing on the underlying execution resource. Ownership of this thread proxy is transferred to the Resource Manager, and you are expected to return from the execution context's Dispatch
method soon after SwitchTo
returns, in order to complete the transfer. The execution context that the thread proxy was dispatching is disassociated from the thread proxy, and the scheduler is free to reuse it or destroy it as it sees fit.
Use the value Blocking
when you want this thread proxy to enter a blocked state. Calling SwitchTo
with the parameter switchState
set to Blocking
will cause the execution context pContext
to start executing, and block the current thread proxy until it is resumed. The scheduler retains ownership of the thread proxy when the thread proxy is in the Blocking
state. The blocking thread proxy can be resumed by calling the function SwitchTo
to switch to this thread proxy's execution context. You can also resume the thread proxy, by using its associated context to activate a virtual processor root. For more information on how to do this, see IVirtualProcessorRoot::Activate.
Use the value Nesting
when you want to temporarily detach this thread proxy from the virtual processor root it is running on, and the scheduler it is dispatching work for. Calling SwitchTo
with the parameter switchState
set to Nesting
will cause the execution context pContext
to start executing and the current thread proxy also continues executing without the need for a virtual processor root. The thread proxy is considered to have left the scheduler until it calls the IThreadProxy::SwitchOut method at a later point in time. The IThreadProxy::SwitchOut
method could block the thread proxy until a virtual processor root is available to reschedule it.
SwitchTo
must be called on the IThreadProxy
interface that represents the currently executing thread or the results are undefined. The function throws invalid_argument
if the parameter pContext
is set to NULL
.
IThreadProxy::YieldToSystem Method
Causes the calling thread to yield execution to another thread that is ready to run on the current processor. The operating system selects the next thread to be executed.
virtual void YieldToSystem() = 0;
Remarks
When called by a thread proxy backed by a regular Windows thread, YieldToSystem
behaves exactly like the Windows function SwitchToThread
. However, when called from user-mode schedulable (UMS) threads, the SwitchToThread
function delegates the task of picking the next thread to run to the user mode scheduler, not the operating system. To achieve the desired effect of switching to a different ready thread in the system, use YieldToSystem
.
YieldToSystem
must be called on the IThreadProxy
interface that represents the currently executing thread or the results are undefined.
See also
concurrency Namespace
IExecutionContext Structure
IScheduler Structure
IVirtualProcessorRoot Structure