IThreadProxy::SwitchOut メソッド
基になる仮想プロセッサ ルートからコンテキストの関連付けを解除します。
virtual void SwitchOut(
SwitchingProxyState switchState = Blocking
) =0;
パラメーター
- switchState
切り替えを実行しているスレッド プロキシの状態を示します。 SwitchingProxyState 型のパラメーター。
解説
なんらかの理由で、実行している仮想プロセッサ ルートからコンテキストの関連付けを解除する必要がある場合には、SwitchOut を使用します。 パラメーター switchState に渡す値によって、または仮想プロセッサ ルート上で実行されるかどうかによって、呼び出しはすぐに制御を返すか、またはコンテキストに関連付けられたスレッド プロキシをブロックします。 パラメーターを Idle に設定して SwitchOut を呼び出すと、エラーになります。 そうすると、invalid_argument の例外が発生します。
SwitchOut は、リソース マネージャーから指示があった場合か、オーバーサブスクリプション状態の一時仮想プロセッサ ルートを要求した後、その処理が終了した場合に、スケジューラの仮想プロセッサ ルートの数を減らす必要があるときに便利です。 この場合、仮想プロセッサ ルート上で IVirtualProcessorRoot::Remove Method メソッドを起動してから、switchState パラメーターを Blocking に設定して SwitchOut を呼び出す必要があります。 これによってスレッド プロキシはブロックされ、スケジューラの別の仮想プロセッサ ルートが処理を実行できるようになると、実行を再開します。 ブロック状態のスレッド プロキシを再開するには、SwitchTo 関数を呼び出してこのスレッド プロキシの実行コンテキストに切り替えます。 関連付けられているコンテキストを使用して仮想プロセッサ ルートをアクティブ化することにより、スレッド プロキシを再開することもできます。 この方法の詳細については、IVirtualProcessorRoot::Activate のトピックを参照してください。
また、SwitchOut を使用して、仮想プロセッサを再初期化することもできます。これによって、スレッド プロキシをブロックするか、または一時的に実行している仮想プロセッサ ルートと処理をディスパッチしているスケジューラからデタッチしながら、後でアクティブ化可能なようにできます。 スレッド プロキシをブロックする場合には、パラメーター switchState を Blocking に設定して SwitchOut を使用します。 既に説明したように、SwitchTo か IVirtualProcessorRoot::Activate を使用して後で再開できます。 このスレッド プロキシが実行されている仮想プロセッサ ルートから、そのスレッド プロキシと、仮想プロセッサが関連付けられているスケジューラとを一時的にデタッチする必要がある場合は、パラメーターを Nesting に設定して SwitchOut を使用します。 仮想プロセッサ ルートで実行中に switchState パラメーターを SwitchOut に設定して Nesting を呼び出した場合、ルートは再初期化され、現在のスレッド プロキシはそれを必要とせずに実行を継続します。 スレッド プロキシは、その後 Blocking を使って IThreadProxy::SwitchOut メソッドが呼び出されるまで、スケジューラに存在しない状態と見なされます。 パラメーターを Blocking に設定して SwitchOut を再び呼び出すと、コンテキストをブロックされた状態に戻し、SwitchTo またはデタッチされたスケジューラの IVirtualProcessorRoot::Activate によって再開できるようにします。 これは仮想プロセッサ ルートで実行されていないため、再初期化は行われません。
再初期化された仮想プロセッサ ルートは、スケジューラがリソース マネージャーから許可された新しい仮想プロセッサ ルートと同様です。 IVirtualProcessorRoot::Activate を使った実行コンテキストによりアクティブ化することによって、それを実行に使用できます。
SwitchOut は、現在実行中のスレッドを表す IThreadProxy インターフェイスで呼び出す必要があります。それ以外の場合、結果は保証されません。
Visual Studio 2010 に付属のライブラリとヘッダーでは、このメソッドはパラメーターを受け取らず、仮想プロセッサ ルートを再初期化しませんでした。 従来の動作を保持するために、既定のパラメーター値 Blocking が用意されています。
必要条件
ヘッダー: concrtrm.h
名前空間: concurrency