次の方法で共有


IVirtualProcessorRoot::Deactivate メソッド

この仮想プロセッサ ルートで現在実行されているスレッド プロキシに、実行コンテキストのディスパッチを中止させます。スレッド プロキシは、Activate メソッドの呼び出しで実行を再開します。

virtual bool Deactivate(
   _Inout_ IExecutionContext * pContext
) =0;

パラメーター

  • pContext
    このルートで現在ディスパッチされているコンテキスト。

戻り値

ブール値。値が true の場合、Activate メソッドの呼び出しに応答して、Deactivate メソッドからスレッド プロキシが戻ったことを示します。値が false の場合、リソース マネージャーの通知イベントに応答して、メソッドからスレッド プロキシが戻ったことを示します。ユーザー モード スケジュール可能 (UMS) スレッド スケジューラでは、この値の場合、項目がスケジューラの完了リストに表示されており、スケジューラで処理する必要があることを示します。

解説

スケジューラに処理する項目がない場合は、このメソッドを使用して、仮想プロセッサ ルートの実行を一時的に停止します。Deactivate メソッドの呼び出しは、仮想プロセッサ ルートが最後にアクティブ化された実行コンテキストの Dispatch メソッド内から行う必要があります。つまり、Deactivate メソッドを呼び出すスレッド プロキシは、仮想プロセッサ ルートで現在実行されている必要があります。実行中ではない仮想プロセッサ ルートでメソッドを呼び出すと、未定義の動作を引き起こす可能性があります。

非アクティブ化された仮想プロセッサ ルートは、Deactivate メソッドに渡した引数と同じ引数を使用して Activate メソッドを呼び出すことで起動できます。スケジューラでは、Activate メソッドと Deactivate メソッドをペアで呼び出す必要がありますが、受け取りの順序は任意です。リソース マネージャーは、Deactivate メソッドの呼び出しを受け取る前に、対応する Activate メソッドの呼び出しの受け取りを処理することができます。

仮想プロセッサ ルートが起動しており、Deactivate メソッドからの戻り値が値 false の場合、スケジューラは IUMSCompletionList::GetUnblockNotifications メソッドを使用して UMS の完了リストを問い合わせ、その情報を処理した後、Deactivate メソッドを再度呼び出します。Deactivate メソッドが値 true を返すまで、この処理は繰り返されます。

引数 pContext が NULL 値を持つ場合、invalid_argument がスローされます。

仮想プロセッサ ルートがこれまで一度もアクティブ化されていない場合、または引数 pContext がこの仮想プロセッサ ルートで最後にディスパッチされた実行コンテキストを表していない場合、invalid_operation がスローされます。

仮想プロセッサ ルートを非アクティブ化すると、基になるハードウェア スレッドのサブスクリプション レベルが 1 つ減少します。サブスクリプション レベルの詳細については、「IExecutionResource::CurrentSubscriptionLevel」を参照してください。

必要条件

ヘッダー: concrtrm.h

名前空間: の同時実行

参照

関連項目

IVirtualProcessorRoot 構造体

IVirtualProcessorRoot::Activate メソッド

IExecutionResource::CurrentSubscriptionLevel メソッド

IUMSCompletionList::GetUnblockNotifications メソッド