IVirtualProcessorRoot 構造体
スレッド プロキシが実行できるハードウェア スレッドの抽象化です。
構文
struct IVirtualProcessorRoot : public IExecutionResource;
メンバー
パブリック メソッド
名前 | 説明 |
---|---|
IVirtualProcessorRoot::Activate | 実行コンテキスト インターフェイス pContext に関連付けられているスレッド プロキシに、この仮想プロセッサ ルートでの実行を開始させます。 |
IVirtualProcessorRoot::Deactivate | この仮想プロセッサ ルートで現在実行されているスレッド プロキシに、実行コンテキストのディスパッチを停止させます。 スレッド プロキシは、Activate メソッドの呼び出しで実行を再開します。 |
IVirtualProcessorRoot::EnsureAllTasksVisible | 個々のプロセッサのメモリ階層に格納されているデータが、システム上のすべてのプロセッサに表示されるようにします。 これにより、メソッドから制御が戻る前に、すべてのプロセッサで完全なメモリ フェンスが実行されたことが保証されます。 |
IVirtualProcessorRoot::GetId | 仮想プロセッサ ルートの一意識別子を返します。 |
解説
各仮想プロセッサ ルートには、実行リソースが関連付けられています。 IVirtualProcessorRoot
インターフェイスは、IExecutionResource インターフェイスから継承されます。 複数の仮想プロセッサ ルートが、基になる同じハードウェア スレッドに対応している場合があります。
Resource Manager は、リソースの要求に応じて、スケジューラに仮想プロセッサ ルートを付与します。 スケジューラは、実行コンテキストで仮想プロセッサ ルートをアクティブにすることで処理を実行できます。
継承階層
IVirtualProcessorRoot
要件
ヘッダー: concrtrm.h
名前空間: concurrency
IVirtualProcessorRoot::Activate メソッド
実行コンテキスト インターフェイス pContext
に関連付けられているスレッド プロキシに、この仮想プロセッサ ルートでの実行を開始させます。
virtual void Activate(_Inout_ IExecutionContext* pContext) = 0;
パラメーター
pContext
この仮想プロセッサ ルートでディスパッチされる実行コンテキストへのインターフェイス。
解説
実行コンテキスト インターフェイス pContext
にスレッド プロキシが関連付けられていない場合、Resource Manager はスレッド プロキシを提供します。
Activate
メソッドを使用すると、Resource Manager から返された新しい仮想プロセッサ ルートで処理の実行を開始できます。また、非アクティブ化された、または非アクティブ化しようとしている仮想プロセッサ ルートでスレッド プロキシを再開することもできます。 非アクティブ化の詳細については、IVirtualProcessorRoot::Deactivate に関するセクションを参照してください。 非アクティブ化された仮想プロセッサ ルートを再開する場合、pContext
パラメーターは、その仮想プロセッサ ルートの非アクティブ化に使用されたパラメーターと同じである必要があります。
仮想プロセッサ ルートが初めてアクティブ化された後、以降の Deactivate
と Activate
の呼び出しのペアが互いに競合する可能性があります。 これは、Resource Manager は受け取るはずだった Deactivate
呼び出しを受け取る前に、Activate
の呼び出しを受け取ることが許容されることを意味します。
仮想プロセッサ ルートをアクティブにしたら、この仮想プロセッサ ルートが現在ビジー状態であることを Resource Manager に通知します。 スケジューラがこのルートで実行する処理を見つけることができない場合は、Deactivate
メソッドを呼び出して、仮想プロセッサ ルートがアイドル状態であることを Resource Manager に通知する必要があります。 Resource Manager は、このデータを使用してシステムの負荷を分散します。
引数 pContext
の値が NULL
の場合、invalid_argument
がスローされます。
引数 pContext
が、この仮想プロセッサ ルートによって直近にディスパッチされた実行コンテキストを表していない場合、invalid_operation
がスローされます。
仮想プロセッサ ルートをアクティブにする操作により、基になるハードウェア スレッドのサブスクリプション レベルが 1 つ上がります。 サブスクリプション レベルの詳細については、「IExecutionResource::CurrentSubscriptionLevel」を参照してください。
IVirtualProcessorRoot::D eactivate メソッド
この仮想プロセッサ ルートで現在実行されているスレッド プロキシに、実行コンテキストのディスパッチを停止させます。 スレッド プロキシは、Activate
メソッドの呼び出しで実行を再開します。
virtual bool Deactivate(_Inout_ IExecutionContext* pContext) = 0;
パラメーター
pContext
このルートによって現在ディスパッチされているコンテキスト。
戻り値
ブール値です。 値 true
は、Activate
メソッドの呼び出しに応答して、Deactivate
メソッドからスレッド プロキシが返されたことを示します。 値 false
は、Resource Manager の通知イベントに応答して、メソッドからスレッド プロキシが返されたことを示します。 ユーザーモード スケジュール可能 (UMS) スレッド スケジューラでは、これは、スケジューラの完了リストに項目が表示されており、スケジューラがそれらを処理する必要があることを示します。
解説
スケジューラで処理が見つからない場合、このメソッドを使用して仮想プロセッサ ルートの実行を一時的に停止します。 Deactivate
メソッドの呼び出しは、その仮想プロセッサ ルートが最後にアクティブ化された実行コンテキストの Dispatch
メソッド内から開始する必要があります。 つまり、Deactivate
メソッドを呼び出すスレッド プロキシは、その仮想プロセッサ ルートで現在実行されているものである必要があります。 実行されていない仮想プロセッサ ルートでメソッドを呼び出した場合、未定義の動作が発生する可能性があります。
非アクティブ化された仮想プロセッサ ルートは、Deactivate
メソッドに渡された同じ引数を使用して Activate
メソッドを呼び出すことで再開できます。 スケジューラは、Activate
メソッドと Deactivate
メソッドの呼び出しが必ずペアになるようにする役割を担いますが、これらを特定の順序で受け取る必要はありません。 Resource Manager は、受け取るはずだった Deactivate
メソッドの呼び出しを受け取る前に、Activate
メソッドの呼び出しの受け取りを処理できます。
仮想プロセッサ ルートが再開し、Deactivate
メソッドからの戻り値が false
の場合、スケジューラは IUMSCompletionList::GetUnblockNotifications
メソッドを介して UMS 完了リストを照会し、その情報に基づいて処理を行った後に、Deactivate
メソッドを再度呼び出す必要があります。 Deactivate
メソッドから値 true
が返されるまで、これを繰り返します。
引数 pContext
の値が NULL の場合、invalid_argument
がスローされます。
仮想プロセッサ ルートがアクティブ化されたことがない場合、または引数 pContext
が、この仮想プロセッサ ルートによって直近にディスパッチされた実行コンテキストを表していない場合は、invalid_operation
がスローされます。
仮想プロセッサ ルートを非アクティブ化する操作により、基になるハードウェア スレッドのサブスクリプション レベルが 1 つ下がります。 サブスクリプション レベルの詳細については、「IExecutionResource::CurrentSubscriptionLevel」を参照してください。
IVirtualProcessorRoot::EnsureAllTasksVisible メソッド
個々のプロセッサのメモリ階層に格納されているデータが、システム上のすべてのプロセッサに表示されるようにします。 これにより、メソッドから制御が戻る前に、すべてのプロセッサで完全なメモリ フェンスが実行されたことが保証されます。
virtual void EnsureAllTasksVisible(_Inout_ IExecutionContext* pContext) = 0;
パラメーター
pContext
この仮想プロセッサ ルートによって現在ディスパッチされているコンテキスト。
解説
このメソッドは、仮想プロセッサ ルートの非アクティブ化を、スケジューラへの新しい処理の追加と同期する場合に役立ちます。 パフォーマンス上の理由から、メモリ バリアを実行せずに、スケジューラに作業項目を追加することにした場合、あるプロセッサで実行されているスレッドによって追加された作業項目は、他のすべてのプロセッサにすぐには表示されません。 このメソッドを Deactivate
メソッドと組み合わせて使用することで、スケジューラのコレクションに作業項目が存在する間、スケジューラが一部の仮想プロセッサ ルートを非アクティブ化しないようにすることができます。
EnsureAllTasksVisibleThe
メソッドの呼び出しは、その仮想プロセッサ ルートが最後にアクティブ化された実行コンテキストの Dispatch
メソッド内から開始する必要があります。 つまり、EnsureAllTasksVisible
メソッドを呼び出すスレッド プロキシは、その仮想プロセッサ ルートで現在実行されているものである必要があります。 実行されていない仮想プロセッサ ルートでメソッドを呼び出した場合、未定義の動作が発生する可能性があります。
引数 pContext
の値が NULL
の場合、invalid_argument
がスローされます。
仮想プロセッサ ルートがアクティブ化されたことがない場合、または引数 pContext
が、この仮想プロセッサ ルートによって直近にディスパッチされた実行コンテキストを表していない場合は、invalid_operation
がスローされます。
IVirtualProcessorRoot::GetId Method
仮想プロセッサ ルートの一意識別子を返します。
virtual unsigned int GetId() const = 0;
戻り値
整数識別子。