現在実行中のコンテキストから別のコンテキストへの協調的なコンテキスト切り替えを実行します。
virtual void SwitchTo(
IExecutionContext * pContext,
SwitchingProxyState switchState
) =0;
パラメーター
pContext
協調的に切り替えられた後の実行コンテキスト。switchState
切り替えを実行しているスレッド プロキシの状態を示します。 SwitchingProxyState 型のパラメーター。
解説
このメソッドは、一方の実行コンテキストからもう一方の実行コンテキストへと切り替える目的で、最初の実行コンテキストの IExecutionContext::Dispatch メソッドから使用します。 このメソッドは、実行コンテキスト pContext をスレッド プロキシに関連付けます (まだ関連付けられていない場合)。 現在のスレッド プロキシの所有権は、引数 switchState に指定した値によって決定されます。
現在実行中のスレッド プロキシをリソース マネージャーに返すには、この値に Idle を使用します。 switchState パラメーターを Idle に設定して SwitchTo を呼び出した場合、実行コンテキスト pContext が、基になる実行リソースで実行を開始します。 このスレッド プロキシの所有権はリソース マネージャーに移譲されます。所有権の移譲を完了する関係上、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 がスローされます。
必要条件
ヘッダー: concrtrm.h
名前空間: Concurrency