An abstraction for a hardware thread.
|IExecutionResource::CurrentSubscriptionLevel||Returns the number of activated virtual processor roots and subscribed external threads currently associated with the underlying hardware thread this execution resource represents.|
|IExecutionResource::GetExecutionResourceId||Returns a unique identifier for the hardware thread that this execution resource represents.|
|IExecutionResource::GetNodeId||Returns a unique identifier for the processor node that this execution resource belongs to.|
|IExecutionResource::Remove||Returns this execution resource to the Resource Manager.|
Execution resources can be standalone or associated with virtual processor roots. A standalone execution resource is created when a thread in your application creates a thread subscription. The methods ISchedulerProxy::SubscribeThread and ISchedulerProxy::RequestInitialVirtualProcessors create thread subscriptions, and return an
IExecutionResource interface representing the subscription. Creating a thread subscription is a way to inform the Resource Manager that a given thread will participate in the work queued to a scheduler, along with the virtual processor roots Resource Manager assigns to the scheduler. The Resource Manager uses the information to avoid oversubscribing hardware threads where it can.
Returns the number of activated virtual processor roots and subscribed external threads currently associated with the underlying hardware thread this execution resource represents.
virtual unsigned int CurrentSubscriptionLevel() const = 0;
The current subscription level.
The subscription level tells you how many running threads are associated with the hardware thread. This only includes threads the Resource Manager is aware of in the form of subscribed threads, and virtual processor roots that are actively executing thread proxies.
Calling the method ISchedulerProxy::SubscribeCurrentThread, or the method ISchedulerProxy::RequestInitialVirtualProcessors with the parameter
doSubscribeCurrentThread set to the value true increments the subscription level of a hardware thread by one. They also return an
IExecutionResource interface representing the subscription. A corresponding call to the IExecutionResource::Remove decrements the hardware thread's subscription level by one.
The act of activating a virtual processor root using the method IVirtualProcessorRoot::Activate increments the subscription level of a hardware thread by one. The methods IVirtualProcessorRoot::Deactivate, or IExecutionResource::Remove decrement the subscription level by one when invoked on an activated virtual processor root.
The Resource Manager uses subscription level information as one of the ways in which to determine when to move resources between schedulers.
Returns a unique identifier for the hardware thread that this execution resource represents.
virtual unsigned int GetExecutionResourceId() const = 0;
A unique identifier for the hardware thread underlying this execution resource.
Each hardware thread is assigned a unique identifier by the Concurrency Runtime. If multiple execution resources are associated hardware thread, they will all have the same execution resource identifier.
Returns a unique identifier for the processor node that this execution resource belongs to.
virtual unsigned int GetNodeId() const = 0;
A unique identifier for a processor node.
The Concurrency Runtime represents hardware threads on the system in groups of processor nodes. Nodes are usually derived from the hardware topology of the system. For example, all processors on a specific socket or a specific NUMA node may belong to the same processor node. The Resource Manager assigns unique identifiers to these nodes starting with
0 up to and including
nodeCount - 1, where
nodeCount represents the total number of processor nodes on the system.
The count of nodes can be obtained from the function GetProcessorNodeCount.
Returns this execution resource to the Resource Manager.
virtual void Remove(_Inout_ IScheduler* pScheduler) = 0;
An interface to the scheduler making the request to remove this execution resource.
Use this method to return standalone execution resources as well as execution resources associated with virtual processor roots to the Resource Manager.
If this is a standalone execution resource you received from either of the methods ISchedulerProxy::SubscribeCurrentThread or ISchedulerProxy::RequestInitialVirtualProcessors, calling the method
Remove will end the thread subscription that the resource was created to represent. You are required to end all thread subscriptions before shutting down a scheduler proxy, and must call
Remove from the thread that created the subscription.
Virtual processor roots, too, can be returned to the Resource Manager by invoking the
Remove method, because the interface
IVirtualProcessorRoot inherits from the
IExecutionResource interface. You may need to return a virtual processor root either in response to a call to the IScheduler::RemoveVirtualProcessors method, or when you are done with an oversubscribed virtual processor root you obtained from the ISchedulerProxy::CreateOversubscriber method. For virtual processor roots, there are no restrictions on which thread can invoke the
invalid_argument is thrown if the parameter
pScheduler is set to
invalid_operation is thrown if the parameter
pScheduler is different from the scheduler that this execution resource was created for, or, with a standalone execution resource, if the current thread is different from the thread that created the thread subscription.