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
を使用して、仮想プロセッサを再初期化することもできます。これによって、スレッド プロキシをブロックするか、または一時的に実行している仮想プロセッサ ルートと処理をディスパッチしているスケジューラからデタッチしながら、後でアクティブ化可能なようにできます。 スレッド プロキシをブロックする場合には、パラメーター SwitchOut
を switchState
に設定して Blocking
を使用します。 既に説明したように、SwitchTo
か IVirtualProcessorRoot::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
を使用します。 パラメーター switchState
を Idle
に設定してを SwitchTo
を呼び出すと、基になる実行リソースで実行コンテキスト pContext
の実行が開始されます。 このスレッドプロキシの所有権は Azure Resource Manager に転送され、転送を完了するために、SwitchTo
が返された直後に実行コンテキストの Dispatch
メソッドから戻ることが想定されています。 スレッドプロキシによってディスパッチされた実行コンテキストはスレッド プロキシとの関連付けが解除され、スケジューラは自由に再利用するか、またはそれに応じて破棄することができます。
このスレッド プロキシがブロックされた状態になるようにするには、値 Blocking
を使用します。 パラメーター switchState
を Blocking
に設定してを SwitchTo
を呼び出すと、実行コンテキスト pContext
が実行を開始し、現在のスレッド プロキシが再開されるまでブロックします。 スレッド プロキシが Blocking
状態にある場合、スケジューラはスレッド プロキシの所有権を保持します。 ブロック状態のスレッド プロキシを再開するには、SwitchTo
関数を呼び出してこのスレッド プロキシの実行コンテキストに切り替えます。 関連付けられているコンテキストを使用して仮想プロセッサ ルートをアクティブ化することにより、スレッド プロキシを再開することもできます。 この方法の詳細は、IVirtualProcessorRoot::Activate を参照してください。
このスレッド プロキシが実行されている仮想プロセッサ ルートと、このスレッド プロキシが処理をディスパッチしているスケジューラから一時的にデタッチしたい場合は、値 Nesting
を使用します。 パラメーター switchState
を Nesting
に設定して SwitchTo
を呼び出すと、実行コンテキスト pContext
が実行を開始し、現在のスレッド プロキシも仮想プロセッサ ルートを必要とせずに実行を継続します。 スレッド プロキシは、後の時点で IThreadProxy::SwitchOut メソッドを呼び出すまで、スケジューラから離れたと見なされます。 IThreadProxy::SwitchOut
メソッドは、仮想プロセッサ ルートを再スケジュールできるようになるまで、スレッド プロキシをブロックする可能性があります。
SwitchTo
は、現在実行中のスレッドを表す IThreadProxy
インターフェイスで呼び出す必要があります。それ以外の場合、結果は保証されません。 パラメーター pContext
が NULL
に設定されている場合、関数は invalid_argument
をスローします。
IThreadProxy::YieldToSystem メソッド
呼び出し元のスレッドから、現在のプロセッサ上で実行する準備が整っている別のスレッドに実行を切り替えます。 オペレーティング システムは、次に実行されるスレッドを選択します。
virtual void YieldToSystem() = 0;
解説
通常の Windows スレッドによってサポートされるスレッド プロキシによって呼び出されると、YieldToSystem
は Windows 関数 SwitchToThread
とまったく同じように動作します。 ただし、ユーザー モード スケジュール可能 (UMS) スレッドから呼び出された場合、SwitchToThread
関数は、オペレーティング システムではなく、ユーザー モード スケジューラに対して実行する次のスレッドを選択するタスクを委任します。 システムで別の準備ができているスレッドに切り替えるために必要な効果を実現するには、YieldToSystem
を使用します。
YieldToSystem
は、現在実行中のスレッドを表す IThreadProxy
インターフェイスで呼び出す必要があります。それ以外の場合、結果は保証されません。
関連項目
コンカレンシー名前空間
IExecutionContext 構造体
IScheduler 構造体
IVirtualProcessorRoot 構造体