次の方法で共有


IVirtualProcessorRoot 構造体

スレッド プロキシが実行できるハードウェア スレッドの抽象化です。

構文

struct IVirtualProcessorRoot : public IExecutionResource;

メンバー

パブリック メソッド

名前 説明
IVirtualProcessorRoot::Activate 実行コンテキスト インターフェイス pContext に関連付けられているスレッド プロキシに、この仮想プロセッサ ルートでの実行を開始させます。
IVirtualProcessorRoot::Deactivate この仮想プロセッサ ルートで現在実行されているスレッド プロキシに、実行コンテキストのディスパッチを停止させます。 スレッド プロキシは、Activate メソッドの呼び出しで実行を再開します。
IVirtualProcessorRoot::EnsureAllTasksVisible 個々のプロセッサのメモリ階層に格納されているデータが、システム上のすべてのプロセッサに表示されるようにします。 これにより、メソッドから制御が戻る前に、すべてのプロセッサで完全なメモリ フェンスが実行されたことが保証されます。
IVirtualProcessorRoot::GetId 仮想プロセッサ ルートの一意識別子を返します。

解説

各仮想プロセッサ ルートには、実行リソースが関連付けられています。 IVirtualProcessorRoot インターフェイスは、IExecutionResource インターフェイスから継承されます。 複数の仮想プロセッサ ルートが、基になる同じハードウェア スレッドに対応している場合があります。

Resource Manager は、リソースの要求に応じて、スケジューラに仮想プロセッサ ルートを付与します。 スケジューラは、実行コンテキストで仮想プロセッサ ルートをアクティブにすることで処理を実行できます。

継承階層

IExecutionResource

IVirtualProcessorRoot

要件

ヘッダー: concrtrm.h

名前空間: concurrency

IVirtualProcessorRoot::Activate メソッド

実行コンテキスト インターフェイス pContext に関連付けられているスレッド プロキシに、この仮想プロセッサ ルートでの実行を開始させます。

virtual void Activate(_Inout_ IExecutionContext* pContext) = 0;

パラメーター

pContext
この仮想プロセッサ ルートでディスパッチされる実行コンテキストへのインターフェイス。

解説

実行コンテキスト インターフェイス pContext にスレッド プロキシが関連付けられていない場合、Resource Manager はスレッド プロキシを提供します。

Activate メソッドを使用すると、Resource Manager から返された新しい仮想プロセッサ ルートで処理の実行を開始できます。また、非アクティブ化された、または非アクティブ化しようとしている仮想プロセッサ ルートでスレッド プロキシを再開することもできます。 非アクティブ化の詳細については、IVirtualProcessorRoot::Deactivate に関するセクションを参照してください。 非アクティブ化された仮想プロセッサ ルートを再開する場合、pContext パラメーターは、その仮想プロセッサ ルートの非アクティブ化に使用されたパラメーターと同じである必要があります。

仮想プロセッサ ルートが初めてアクティブ化された後、以降の DeactivateActivate の呼び出しのペアが互いに競合する可能性があります。 これは、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;

戻り値

整数識別子。

関連項目

コンカレンシー名前空間