IThreadProxy 構造体

実行スレッドの抽象化です。 作成するスケジューラの SchedulerType ポリシー キーに応じて、リソース マネージャーは、通常の Win32 スレッドまたはユーザー モード スケジュール可能 (UMS: User-Mode Schedulable) スレッドによってサポートされるスレッド プロキシを許可します。 UMS スレッドは、Windows 7 以上のバージョンの 64 ビット オペレーティング システムでサポートされます。

構文

struct IThreadProxy;

メンバー

パブリック メソッド

名前 説明
IThreadProxy::GetId スレッド プロキシの一意識別子を返します。
IThreadProxy::SwitchOut 基になる仮想プロセッサ ルートからコンテキストの関連付けを解除します。
IThreadProxy::SwitchTo 現在実行中のコンテキストから別のコンテキストへの協調的なコンテキスト切り替えを実行します。
IThreadProxy::YieldToSystem 呼び出し元のスレッドから、現在のプロセッサ上で実行する準備が整っている別のスレッドに実行を切り替えます。 オペレーティング システムは、次に実行されるスレッドを選択します。

解説

スレッド プロキシは、作業をディスパッチする手段として、インターフェイス IExecutionContext によって表される実行コンテキストと結合されます。

継承階層

IThreadProxy

必要条件

ヘッダー: concrtrm.h

名前空間: concurrency

IThreadProxy::GetId メソッド

スレッド プロキシの一意識別子を返します。

virtual unsigned int GetId() const = 0;

戻り値

一意の整数識別子。

IThreadProxy::SwitchOut メソッド

基になる仮想プロセッサ ルートからコンテキストの関連付けを解除します。

virtual void SwitchOut(SwitchingProxyState switchState = Blocking) = 0;

パラメーター

switchState
切り替えを実行しているスレッド プロキシの状態を示します。 SwitchingProxyState 型のパラメーター。

解説

なんらかの理由で、実行している仮想プロセッサ ルートからコンテキストの関連付けを解除する必要がある場合には、SwitchOut を使用します。 パラメーター switchState に渡す値によって、または仮想プロセッサ ルート上で実行されるかどうかによって、呼び出しはすぐに制御を返すか、またはコンテキストに関連付けられたスレッド プロキシをブロックします。 パラメーターを SwitchOut に設定して Idle を呼び出すと、エラーになります。 そうすると、invalid_argument の例外が発生します。

SwitchOut は、リソース マネージャーから指示があった場合か、オーバーサブスクリプション状態の一時仮想プロセッサ ルートを要求した後、その処理が終了した場合に、スケジューラの仮想プロセッサ ルートの数を減らす必要があるときに便利です。 この場合、仮想プロセッサ ルート上で IVirtualProcessorRoot::Remove メソッドを起動してから、switchState パラメーターを Blocking に設定して SwitchOut を呼び出す必要があります。 これによってスレッド プロキシはブロックされ、スケジューラの別の仮想プロセッサ ルートが処理を実行できるようになると、実行を再開します。 ブロック状態のスレッド プロキシを再開するには、SwitchTo 関数を呼び出してこのスレッド プロキシの実行コンテキストに切り替えます。 関連付けられているコンテキストを使用して仮想プロセッサ ルートをアクティブ化することにより、スレッド プロキシを再開することもできます。 この方法の詳細は、IVirtualProcessorRoot::Activate を参照してください。

また、SwitchOut を使用して、仮想プロセッサを再初期化することもできます。これによって、スレッド プロキシをブロックするか、または一時的に実行している仮想プロセッサ ルートと処理をディスパッチしているスケジューラからデタッチしながら、後でアクティブ化可能なようにできます。 スレッド プロキシをブロックする場合には、パラメーター SwitchOutswitchState に設定して Blocking を使用します。 既に説明したように、SwitchToIVirtualProcessorRoot::Activate を使用して後で再開できます。 このスレッド プロキシが実行されている仮想プロセッサ ルートから、そのスレッド プロキシと、仮想プロセッサが関連付けられているスケジューラとを一時的にデタッチする必要がある場合は、パラメーターを SwitchOut に設定して Nesting を使用します。 仮想プロセッサ ルートで実行中に SwitchOut パラメーターを switchState に設定して Nesting を呼び出した場合、ルートは再初期化され、現在のスレッド プロキシはそれを必要とせずに実行を継続します。 スレッド プロキシは、後の時点で IThreadProxy::SwitchOut メソッドを Blocking で呼び出すまで、スケジューラから離れたと見なされます。 パラメーターを SwitchOut に設定して Blocking を再び呼び出すと、コンテキストをブロックされた状態に戻し、SwitchTo またはデタッチされたスケジューラの IVirtualProcessorRoot::Activate によって再開できるようにします。 これは仮想プロセッサ ルートで実行されていないため、再初期化は行われません。

再初期化された仮想プロセッサ ルートは、スケジューラがリソース マネージャーから許可された新しい仮想プロセッサ ルートと同様です。 IVirtualProcessorRoot::Activate を使った実行コンテキストによりアクティブ化することによって、それを実行に使用できます。

SwitchOut は、現在実行中のスレッドを表す IThreadProxy インターフェイスで呼び出す必要があります。それ以外の場合、結果は保証されません。

Visual Studio 2010 に付属のライブラリとヘッダーでは、このメソッドはパラメーターを受け取らず、仮想プロセッサ ルートを再初期化しませんでした。 従来の動作を保持するために、既定のパラメーター値 Blocking が用意されています。

IThreadProxy::SwitchTo メソッド

現在実行中のコンテキストから別のコンテキストへの協調的なコンテキスト切り替えを実行します。

virtual void SwitchTo(
    _Inout_ IExecutionContext* pContext,
    SwitchingProxyState switchState) = 0;

パラメーター

pContext
協調的に切り替える実行コンテキスト。

switchState
切り替えを実行しているスレッド プロキシの状態を示します。 SwitchingProxyState 型のパラメーター。

解説

最初の実行コンテキストの IExecutionContext::Dispatch メソッドから別の実行コンテキストに切り替えるには、このメソッドを使用します。 メソッドは、まだ関連付けられていない場合、実行コンテキスト pContext をスレッド プロキシに関連付けます。 現在のスレッド プロキシの所有権は、switchState 引数に指定した値によって決まります。

現在実行中のスレッド プロキシをリソース マネージャーに返す場合は、値 Idle を使用します。 パラメーター switchStateIdle に設定してを SwitchTo を呼び出すと、基になる実行リソースで実行コンテキスト pContext の実行が開始されます。 このスレッドプロキシの所有権は Azure Resource Manager に転送され、転送を完了するために、SwitchTo が返された直後に実行コンテキストの Dispatch メソッドから戻ることが想定されています。 スレッドプロキシによってディスパッチされた実行コンテキストはスレッド プロキシとの関連付けが解除され、スケジューラは自由に再利用するか、またはそれに応じて破棄することができます。

このスレッド プロキシがブロックされた状態になるようにするには、値 Blocking を使用します。 パラメーター switchStateBlocking に設定してを SwitchTo を呼び出すと、実行コンテキスト pContext が実行を開始し、現在のスレッド プロキシが再開されるまでブロックします。 スレッド プロキシが Blocking 状態にある場合、スケジューラはスレッド プロキシの所有権を保持します。 ブロック状態のスレッド プロキシを再開するには、SwitchTo 関数を呼び出してこのスレッド プロキシの実行コンテキストに切り替えます。 関連付けられているコンテキストを使用して仮想プロセッサ ルートをアクティブ化することにより、スレッド プロキシを再開することもできます。 この方法の詳細は、IVirtualProcessorRoot::Activate を参照してください。

このスレッド プロキシが実行されている仮想プロセッサ ルートと、このスレッド プロキシが処理をディスパッチしているスケジューラから一時的にデタッチしたい場合は、値 Nesting を使用します。 パラメーター switchStateNesting に設定して SwitchTo を呼び出すと、実行コンテキスト pContext が実行を開始し、現在のスレッド プロキシも仮想プロセッサ ルートを必要とせずに実行を継続します。 スレッド プロキシは、後の時点で IThreadProxy::SwitchOut メソッドを呼び出すまで、スケジューラから離れたと見なされます。 IThreadProxy::SwitchOut メソッドは、仮想プロセッサ ルートを再スケジュールできるようになるまで、スレッド プロキシをブロックする可能性があります。

SwitchTo は、現在実行中のスレッドを表す IThreadProxy インターフェイスで呼び出す必要があります。それ以外の場合、結果は保証されません。 パラメーター pContextNULL に設定されている場合、関数は invalid_argument をスローします。

IThreadProxy::YieldToSystem メソッド

呼び出し元のスレッドから、現在のプロセッサ上で実行する準備が整っている別のスレッドに実行を切り替えます。 オペレーティング システムは、次に実行されるスレッドを選択します。

virtual void YieldToSystem() = 0;

解説

通常の Windows スレッドによってサポートされるスレッド プロキシによって呼び出されると、YieldToSystem は Windows 関数 SwitchToThread とまったく同じように動作します。 ただし、ユーザー モード スケジュール可能 (UMS) スレッドから呼び出された場合、SwitchToThread 関数は、オペレーティング システムではなく、ユーザー モード スケジューラに対して実行する次のスレッドを選択するタスクを委任します。 システムで別の準備ができているスレッドに切り替えるために必要な効果を実現するには、YieldToSystem を使用します。

YieldToSystem は、現在実行中のスレッドを表す IThreadProxy インターフェイスで呼び出す必要があります。それ以外の場合、結果は保証されません。

関連項目

コンカレンシー名前空間
IExecutionContext 構造体
IScheduler 構造体
IVirtualProcessorRoot 構造体