📄 concrtrm.h
字号:
virtual int EnterHyperCriticalRegion() =0;
/// <summary>
/// Called in order to exit a hyper-critical region.
/// </summary>
/// <returns>
/// The new depth of hyper-critical region. Hyper-critical regions are reentrant.
/// </returns>
/// <seealso cref="IUMSThreadProxy::EnterHyperCriticalRegion Method"/>
/**/
virtual int ExitHyperCriticalRegion() =0;
/// <summary>
/// Returns what kind of critical region the thread proxy is within. Since hyper-critical regions are a superset of critical regions, if code
/// has entered a critical region and then a hyper-critical region, <c>InsideHyperCriticalRegion</c> will be returned.
/// </summary>
/// <returns>
/// The type of critical region the thread proxy is within.
/// </returns>
/// <seealso cref="CriticalRegionType Enumeration"/>
/**/
virtual CriticalRegionType GetCriticalRegionType() const =0;
};
/// <summary>
/// An abstraction for a hardware thread.
/// </summary>
/// <remarks>
/// 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 <see cref="ISchedulerProxy::SubscribeCurrentThread Method">
/// ISchedulerProxy::SubscribeThread</see> and <see cref="ISchedulerProxy::RequestInitialVirtualProcessors Method">
/// ISchedulerProxy::RequestInitialVirtualProcessors</see> create thread subscriptions, and return an <c>IExecutionResource</c> 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.
/// </remarks>
/// <seealso cref="IVirtualProcessorRoot Structure"/>
/// <seealso cref="ISchedulerProxy::SubscribeCurrentThread Method"/>
/// <seealso cref="ISchedulerProxy::RequestInitialVirtualProcessors Method"/>
/**/
struct IExecutionResource
{
/// <summary>
/// Returns a unique identifier for the processor node that this execution resource belongs to.
/// </summary>
/// <returns>
/// A unique identifier for a processor node.
/// </returns>
/// <remarks>
/// 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 <c>0</c> up to and including
/// <c>nodeCount - 1</c>, where <c>nodeCount</c> represents the total number of processor nodes on the system.
/// <para>The count of nodes can be obtained from the function <see cref="GetProcessorNodeCount Function">GetProcessorNodeCount</see>.</para>
/// </remarks>
/**/
virtual unsigned int GetNodeId() const =0;
/// <summary>
/// Returns a unique identifier for the hardware thread that this execution resource represents.
/// </summary>
/// <returns>
/// A unique identifier for the hardware thread underlying this execution resource.
/// </returns>
/// <remarks>
/// 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.
/// </remarks>
/**/
virtual unsigned int GetExecutionResourceId() const =0;
/// <summary>
/// Returns this execution resource to the Resource Manager.
/// </summary>
/// <param name="pScheduler">
/// An interface to the scheduler making the request to remove this execution resource.
/// </param>
/// <remarks>
/// Use this method to return standalone execution resources as well as execution resources associated with virtual processor roots to
/// the Resource Manager.
/// <para>If this is a standalone execution resource you received from either of the methods <see cref="ISchedulerProxy::SubscribeCurrentThread Method">
/// ISchedulerProxy::SubscribeCurrentThread</see> or <see cref="ISchedulerProxy::RequestInitialVirtualProcessors Method">
/// ISchedulerProxy::RequestInitialVirtualProcessors</see>, calling the method <c>Remove</c> 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 <c>Remove</c> from the thread that created the subscription.</para>
/// <para>Virtual processor roots, too, can be returned to the Resource Manager by invoking the <c>Remove</c> method, since the interface
/// <c>IVirtualProcessorRoot</c> inherits from the <c>IExecutionResource</c> interface. You may need to return a virtual processor root either
/// in response to a call to the <see cref="IScheduler::RemoveVirtualProcessors Method">IScheduler::RemoveVirtualProcessors</see>
/// method, or when you are done with an oversubscribed virtual processor root you obtained from the <see cref="ISchedulerProxy::CreateOversubscriber Method">
/// ISchedulerProxy::CreateOversubscriber</see> method. For virtual processor roots, there are no restrictions on which thread can invoke
/// the <c>Remove</c> method.</para>
/// <para><c>invalid_argument</c> is thrown if the parameter <paramref name="pScheduler"/> is set to <c>NULL</c>.</para>
/// <para><c>invalid_operation</c> is thrown if the parameter <paramref name="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.</para>
/// </remarks>
/// <seealso cref="invalid_argument Class"/>
/// <seealso cref="invalid_operation Class"/>
/**/
virtual void Remove(IScheduler * pScheduler) =0;
/// <summary>
/// Returns the number of activated virtual processor roots and subscribed external threads currently associated with the underlying
/// hardware thread this execution resource represents.
/// </summary>
/// <returns>
/// The current subscription level.
/// </returns>
/// <remarks>
/// 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.
/// <para>Calling the method <see cref="ISchedulerProxy::SubscribeCurrentThread Method">ISchedulerProxy::SubscribeCurrentThread</see>,
/// or the method <see cref="ISchedulerProxy::RequestInitialVirtualProcessors Method">ISchedulerProxy::RequestInitialVirtualProcessors
/// </see> with the parameter <paramref name="doSubscribeCurrentThread"/> set to the value <c>true</c> increments the subscription
/// level of a hardware thread by one. They also return an <c>IExecutionResource</c> interface representing the subscription. A
/// corresponding call to the <see cref="IExecutionResource::Remove Method"> IExecutionResource::Remove</see> decrements the
/// hardware thread's subscription level by one.</para>
/// <para>The act of activating a virtual processor root using the method <see cref="IVirtualProcessorRoot::Activate Method">
/// IVirtualProcessorRoot::Activate</see> increments the subscription level of a hardware thread by one. The methods
/// <see cref="IVirtualProcessorRoot::Deactivate Method">IVirtualProcessorRoot::Deactivate</see>, or
/// <see cref="IExecutionResource::Remove Method">IExecutionResource::Remove</see> decrement the subscription level by one
/// when invoked on an activated virtual processor root.</para>
/// <para>The Resource Manager uses subscription level information as one of the ways in which to determine when to move resources
/// between schedulers.</para>
/// </remarks>
/**/
virtual unsigned int CurrentSubscriptionLevel() const =0;
};
/// <summary>
/// An abstraction for a hardware thread on which a thread proxy can execute.
/// </summary>
/// <remarks>
/// Every virtual processor root has an associated execution resource. The <c>IVirtualProcessorRoot</c> interface inherits from the
/// <see cref="IExecutionResource Structure">IExecutionResource</see> interface. Multiple virtual processor roots may correspond to the same
/// underlying hardware thread.
/// <para>The Resource Manager grants virtual processor roots to schedulers in response to requests for resources. A scheduler can use
/// a virtual processor root to perform work by activating it with an execution context.</para>
/// </remarks>
/**/
struct IVirtualProcessorRoot : public IExecutionResource
{
/// <summary>
/// Returns a unique identifier for the virtual processor root.
/// </summary>
/// <returns>
/// An integer identifier.
/// </returns>
/**/
virtual unsigned int GetId() const =0;
/// <summary>
/// Causes the thread proxy associated with the execution context interface <paramref name="pContext"/> to start executing on this
/// virtual processor root.
/// </summary>
/// <param name="pContext">
/// An interface to the execution context that will be dispatched on this virtual processor root.
/// </param>
/// <remarks>
/// The Resource Manager will supply a thread proxy if one is not associated with the execution context interface <paramref name="pContext"/>
/// <para>The <c>Activate</c> method can be used to start executing work on a new virtual processor root returned by the Resource Manager, or to resume
/// the thread proxy on a virtual processor root that has deactivated or is about to deactivate. See <see cref="IVirtualProcessorRoot::Deactivate Method">
/// IVirtualProcessorRoot::Deactivate</see> for more information on deactivation. When you are resuming a deactivated virtual processor
/// root, the parameter <paramref name="pContext"/> must be the same as the parameter used to deactivate the virtual processor root.</para>
/// <para> Once a virtual processor root has been activated for the first time, subsequent pairs of calls to <c>Deactivate</c> and
/// <c>Activate</c> may race with each other. This means it is acceptable for the Resource Manager to receive a call to <c>Activate</c>
/// before it receives the <c>Deactivate</c> call it was meant for.</para>
/// <para>When you activate a virtual processor root, you signal to the Resource Manager that this virtual processor root is currently
/// busy with work. If your scheduler cannot find any work to execute on this root, it is expected to invoke the <c>Deactivate</c> method
/// informing the Resource Manager that the virtual processor root is idle. The Resource Manager uses this data to
/// load balance the system.</para>
/// <para><c>invalid_argument</c> is thrown if the argument <paramref name="pContext"/> has the value <c>NULL</c>.</para>
/// <para><c>invalid_operation</c> is thrown if the argument <paramref name="pContext"/> does not represent the execution context that
/// was most recently dispatched by this virtual processor root.</para>
/// <para>The act of activating a virtual processor root increases the subscription level of the underlying hardware thread by one. For more
/// information on subscription levels, see <see cref="IExecutionResource::CurrentSubscriptionLevel Method">
/// IExecutionResource::CurrentSubscriptionLevel</see>.</para>
/// </remarks>
/// <seealso cref="IVirtualProcessorRoot::Deactivate Method"/>
/// <seealso cref="IExecutionResource::CurrentSubscriptionLevel Method"/>
/**/
virtual void Activate(IExecutionContext * pContext) =0;
/// <summary>
/// Causes the thread proxy currently executing on this virtual processor root to stop dispatching the execution context. The thread proxy
/// will resume executing on a call to the <c>Activate</c> method.
/// </summary>
/// <param name="pContext">
/// The context which is currently being dispatched by this root.
/// </param>
/// <returns>
/// A boolean value. A value of <c>true</c> indicates that the thread proxy returned from the <c>Deactivate</c> method in response to
/// a call to the <c>Activate</c> method. A value of <c>false</c> indicates that the thread proxy returned from the method in response
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -