📄 concrtrm.h
字号:
virtual void SetProxy(IThreadProxy * pThreadProxy) =0;
/// <summary>
/// The method that is called when a thread proxy starts executing a particular execution context. This should be the main worker
/// routine for your scheduler.
/// </summary>
/// <param name="pDispatchState">
/// A pointer to the state under which this execution context is being dispatched. For more information on dispatch state, see
/// <see cref="DispatchState Structure">DispatchState</see>.
/// </param>
/**/
virtual void Dispatch(DispatchState * pDispatchState) =0;
};
/// <summary>
/// An abstraction for a thread of execution. Depending on the <c>SchedulerType</c> 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.
/// </summary>
/// <remarks>
/// Thread proxies are coupled to execution contexts represented by the interface <c>IExecutionContext</c> as a means of dispatching work.
/// </remarks>
/// <seealso cref="IExecutionContext Structure"/>
/// <seealso cref="IScheduler Structure"/>
/// <seealso cref="IVirtualProcessorRoot Structure"/>
/**/
struct IThreadProxy
{
/// <summary>
/// Returns a unique identifier for the thread proxy.
/// </summary>
/// <returns>
/// A unique integer identifier.
/// </returns>
/**/
virtual unsigned int GetId() const =0;
/// <summary>
/// Performs a cooperative context switch from the currently executing context to a different one.
/// </summary>
/// <param name="pContext">
/// The execution context to cooperatively switch to.
/// </param>
/// <param name="switchState">
/// Indicates the state of the thread proxy that is executing the switch. The parameter is of type <typeparamref name="SwitchingProxyState"/>.
/// </param>
/// <remarks>
/// Use this method to switch from one execution context to another, from the <see cref="IExecutionContext::Dispatch Method">
/// IExecutionContext::Dispatch </see> method of the first execution context.
/// The method associates the execution context <paramref name="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 <paramref name="switchState"/>
/// argument.
///
/// <para> Use the value <c>Idle</c> when you want to return the currently executing thread proxy to the Resource Manager.
/// Calling <c>SwitchTo</c> with the parameter <paramref name="switchState"/> set to <c>Idle</c> will cause
/// the execution context <paramref name="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
/// <c>Dispatch</c> method soon after <c>SwitchTo</c> 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.</para>
///
/// <para> Use the value <c>Blocking</c> when you want this thread proxy to enter a blocked state. Calling
/// <c>SwitchTo</c> with the parameter <paramref name="switchState"/> set to <c>Blocking</c> will cause the execution context
/// <paramref name="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 <c>Blocking</c> state. The blocking thread proxy
/// can be resumed by calling the function <c>SwitchTo</c> 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 <see cref="IVirtualProcessorRoot::Activate Method"> IVirtualProcessorRoot::Activate</see>.</para>
///
/// <para> Use the value <c>Nesting</c> 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 <c>SwitchTo</c> with the parameter <paramref name="switchState"/>
/// set to <c>Nesting</c> will cause the execution context <paramref name="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 <see cref="IThreadProxy::SwitchOut Method">IThreadProxy::SwitchOut</see>
/// method at a later point in time. The <c>IThreadProxy::SwitchOut</c> method could block the thread proxy until a virtual
/// processor root is available to reschedule it.</para>
/// <para><c>SwitchTo</c> must be called on the <c>IThreadProxy</c> interface that represents the currently executing thread
/// or the results are undefined. The function throws <c>invalid_argument</c> if the parameter <paramref name="pContext"/>
/// is set to <c>NULL</c>.</para>
/// </remarks>
/// <seealso cref="SwitchingProxyState Enumeration"/>
/**/
virtual void SwitchTo(IExecutionContext * pContext, SwitchingProxyState switchState) =0;
/// <summary>
/// Blocks the currently executing thread proxy until it can be resumed by an available virtual processor root.
/// </summary>
/// <remarks>
/// Use <c>SwitchOut</c> to block an executing thread proxy after relinquishing the underlying virtual processor root. This method 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. The
/// thread proxy can resume execution when a different virtual processor root in the scheduler is available to execute it.
/// <para> The blocking thread proxy can be resumed by calling the function <c>SwitchTo</c> 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 <see cref="IVirtualProcessorRoot::Activate Method"> IVirtualProcessorRoot::Activate</see>.</para>
/// <para><c>SwitchOut</c> must be called on the <c>IThreadProxy</c> interface that represents the currently executing thread
/// or the results are undefined.</para>
/// </remarks>
/**/
virtual void SwitchOut() =0;
/// <summary>
/// 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.
/// </summary>
/// <remarks>
/// When called by a thread proxy backed by a regular Windows thread, <c>YieldToSystem</c> behaves exactly like the Windows function
/// <c>SwitchToThread</c>. However, when called from user-mode schedulable (UMS) threads, the <c>SwitchToThread</c> 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 <c>YieldToSystem</c>.
/// <para><c>YieldToSystem</c> must be called on the <c>IThreadProxy</c> interface that represents the currently executing thread
/// or the results are undefined.</para>
/// </remarks>
/**/
virtual void YieldToSystem() = 0;
};
/// <summary>
/// The type of critical region a context is inside.
/// </summary>
/// <seealso cref="IUMSThreadProxy Structure"/>
/**/
enum CriticalRegionType
{
/// <summary>
/// Indicates that the context is outside any critical region.
/// </summary>
/**/
OutsideCriticalRegion,
/// <summary>
/// Indicates that the context is inside a critical region. When inside a critical region, asynchronous suspensions are hidden from
/// the scheduler. Should such a suspension happen, the Resource Manager will wait for the thread to become runnable and simply resume it instead
/// of invoking the scheduler again. Any locks taken inside such a region must be taken with extreme care.
/// </summary>
/**/
InsideCriticalRegion,
/// <summary>
/// Indicates that the context is inside a hyper-critical region. When inside a hyper-critical region, both synchronous and asynchronous
/// suspensions are hidden from the scheduler. Should such a suspension or blocking happen, the resource manager will wait for the thread to
/// become runnable and simply resume it instead of invoking the scheduler again. Locks taken inside such a region must never be shared with
/// code running outside such a region. Doing so will cause unpredictable deadlock.
/// </summary>
/**/
InsideHyperCriticalRegion
};
/// <summary>
/// An abstraction for a thread of execution. If you want your scheduler to be granted user-mode schedulable (UMS) threads, set the value for the
/// scheduler policy element <c>SchedulerKind</c> to <c>UmsThreadDefault</c>, and implement the <c>IUMSScheduler</c> interface.
/// UMS threads are only supported on 64-bit operating systems with version Windows 7 and higher.
/// </summary>
/// <seealso cref="IUMSScheduler Structure"/>
/// <seealso cref="SchedulerType Enumeration"/>
/**/
struct IUMSThreadProxy : public IThreadProxy
{
/// <summary>
/// Called in order to enter a critical region. When inside a critical region, the scheduler will not observe asynchronous blocking operations
/// that happen during the region. This means that the scheduler will not be reentered for page faults, thread suspensions, kernel asynchronous
/// procedure calls (APCs), etc., for a UMS thread.
/// </summary>
/// <returns>
/// The new depth of critical region. Critical regions are reentrant.
/// </returns>
/// <seealso cref="IUMSThreadProxy::ExitCriticalRegion Method"/>
/**/
virtual int EnterCriticalRegion() =0;
/// <summary>
/// Called in order to exit a critical region.
/// </summary>
/// <returns>
/// The new depth of critical region. Critical regions are reentrant.
/// </returns>
/// <seealso cref="IUMSThreadProxy::EnterCriticalRegion Method"/>
/**/
virtual int ExitCriticalRegion() =0;
/// <summary>
/// Called in order to enter a hyper-critical region. When inside a hyper-critical region, the scheduler will not observe any blocking operations
/// that happen during the region. This means the scheduler will not be reentered for blocking function calls, lock acquisition attempts which
/// block, page faults, thread suspensions, kernel asynchronous procedure calls (APCs), etc., for a UMS thread.
/// </summary>
/// <returns>
/// The new depth of hyper-critical region. Hyper-critical regions are reentrant.
/// </returns>
/// <remarks>
/// The scheduler must be extraordinarily careful about what methods it calls and what locks it acquires in such regions. If code in such a
/// region blocks on a lock that is held by something the scheduler is responsible for scheduling, deadlock may ensue.
/// </remarks>
/// <seealso cref="IUMSThreadProxy::ExitHyperCriticalRegion Method"/>
/**/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -