📄 concrtrm.h
字号:
/***
* ==++==
*
* Copyright (c) Microsoft Corporation. All rights reserved.
*
* ==--==
* =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
*
* concrtrm.h
*
* Main public header file for ConcRT's Resource Manager. This is the only header file a client
* needs to include to build atop the resource manager.
*
* The core runtime, agents, and the PPL live in different headers.
* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
****/
#pragma once
#include <crtdefs.h>
#if !(defined (_M_AMD64) || defined (_M_IX86))
#error ERROR: Concurrency Runtime is supported only on X64 and X86 architectures.
#endif /* !(defined (_M_AMD64) || defined (_M_IX86)) */
#if defined (_M_CEE)
#error ERROR: Concurrency Runtime is not supported when compiling /clr.
#endif /* defined (_M_CEE) */
#ifndef __cplusplus
#error ERROR: Concurrency Runtime is supported only for C++.
#endif /* __cplusplus */
#pragma pack(push,_CRT_PACKING)
/// <summary>
/// The <c>Concurrency</c> namespace provides classes and functions that give you access to the Concurrency Runtime,
/// a concurrent programming framework for C++. For more information, see <see cref="Concurrency Runtime"/>.
/// </summary>
/**/
namespace Concurrency
{
//
// Forward Declarations:
//
struct IScheduler;
struct IThreadProxy;
class SchedulerPolicy;
/// <summary>
/// Used to denote the state a thread proxy is in, when it is executing a cooperative context switch to a different thread
/// proxy.
/// </summary>
/// <remarks>
/// A parameter of type <c>SwitchingProxyState</c> is passed in to the method <c>IThreadProxy::SwitchTo</c> to
/// instruct the Resource Manager how to treat the thread proxy that is making the call.
/// <para>For more information on how this type is used, see <see cref="IThreadProxy::SwitchTo Method">IThreadProxy::SwitchTo
/// </see>.</para>
/// </remarks>
/**/
enum SwitchingProxyState
{
/// <summary>
/// Indicates that the calling thread is no longer needed by the scheduler and is being returned to the Resource Manager. The
/// context which was being dispatched is no longer able to be utilized by the Resource Manager.
/// </summary>
/**/
Idle,
/// <summary>
/// Indicates that the calling thread is cooperatively blocking and should be exclusively owned by the caller until subsequently
/// running again and performing other action.
/// </summary>
/**/
Blocking,
/// <summary>
/// Indicates that the calling thread is nesting a child scheduler and is needed by the caller, in order to attach to a
/// different scheduler.
/// </summary>
/**/
Nesting
};
/// <summary>
/// The <c>DispatchState</c> structure is used to transfer state to the <c>IExecutionContext::Dispatch</c> method. It describes
/// the circumstances under which the <c>Dispatch</c> method is invoked on an <c>IExecutionContext</c> interface.
/// </summary>
/// <seealso cref="IExecutionContext::Dispatch Method"/>
/**/
struct DispatchState
{
/// <summary>
/// Constructs a new <c>DispatchState</c> object.
/// </summary>
/**/
DispatchState() : m_dispatchStateSize(sizeof(DispatchState)), m_fIsPreviousContextAsynchronouslyBlocked(0), m_reserved(0)
{
}
/// <summary>
/// Size of this structure, which is used for versioning.
/// </summary>
/**/
unsigned long m_dispatchStateSize;
/// <summary>
/// Tells whether this context has entered the <c>Dispatch</c> method because the previous context asynchronously blocked.
/// This is used only on the UMS scheduling context, and is set to the value <c>0</c> for all other execution contexts.
/// </summary>
/// <seealso cref="IExecutionContext::Dispatch Method"/>
/**/
unsigned int m_fIsPreviousContextAsynchronouslyBlocked : 1;
/// <summary>
/// Bits reserved for future information passing.
/// </summary>
/// <seealso cref="IExecutionContext::Dispatch Method"/>
/**/
unsigned int m_reserved : 31;
};
/// <summary>
/// An interface to an execution context which can run on a given virtual processor and be cooperatively context switched.
/// </summary>
/// <remarks>
/// If you are implementing a custom scheduler that interfaces with the Concurrency Runtime's Resource Manager, you will need
/// to implement the <c>IExecutionContext</c> interface. The threads created by the Resource Manager perform work on behalf
/// of your scheduler by executing the <c>IExecutionContext::Dispatch</c> method.
/// </remarks>
/// <seealso cref="IScheduler Structure"/>
/// <seealso cref="IThreadProxy Structure"/>
/**/
struct IExecutionContext
{
/// <summary>
/// Returns a unique identifier for the execution context.
/// </summary>
/// <returns>
/// A unique integer identifier.
/// </returns>
/// <remarks>
/// You should use the method <c>GetExecutionContextId</c> to obtain a unique identifier for the object that implements the
/// <c>IExecutionContext</c> interface, before you use the interface as a parameter to methods supplied by the Resource Manager.
/// You are expected to return the same identifier when the <c>GetId</c> function is invoked. <para> An identifier obtained from a different
/// source could result in undefined behavior.</para>
/// </remarks>
/// <seealso cref="GetExecutionContextId Function"/>
/**/
virtual unsigned int GetId() const =0;
/// <summary>
/// Returns an interface to the scheduler this execution context belongs to.
/// </summary>
/// <returns>
/// An <c>IScheduler</c> interface.
/// </returns>
/// <remarks>
/// You are required to initialize the execution context with a valid <c>IScheduler</c> interface before you use it as a parameter to
/// methods supplied by the Resource Manager.
/// </remarks>
/**/
virtual IScheduler * GetScheduler() =0;
/// <summary>
/// Returns an interface to the thread proxy that is executing this context.
/// </summary>
/// <returns>
/// An <c>IThreadProxy</c> interface. If the execution context's thread proxy has not been initialized with a call to <c>SetProxy</c>,
/// the function must return <c>NULL</c>.
/// </returns>
/// <remarks>
/// The Resource Manager will invoke the <c>SetProxy</c> method on an execution context, with an <c>IThreadProxy</c> interface
/// as a parameter, prior to entering the <c>Dispatch</c> method on the on the context. You are expected to store this argument and return it
/// on calls to <c>GetProxy()</c>.
/// </remarks>
/// <seealso cref="IExecutionContext::SetProxy Method"/>
/**/
virtual IThreadProxy * GetProxy() =0;
/// <summary>
/// Associates a thread proxy with this execution context. The associated thread proxy invokes this method right before it starts
/// executing the context's <c>Dispatch</c> method.
/// </summary>
/// <param name="pThreadProxy">
/// An interface to the thread proxy that is about to enter the <c>Dispatch</c> method on this execution context.
/// </param>
/// <remarks>
/// You are expected to save the parameter <paramref name="pThreadProxy"/> and return it on a call to the <c>GetProxy</c> method.
/// The Resource Manager guarantees that the thread proxy associated with the execution context will not change while the
/// thread proxy is executing the <c>Dispatch</c> method.
/// </remarks>
/// <seealso cref="IExecutionContext::GetProxy Method"/>
/**/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -