次の方法で共有


IExecutionResource 構造体

ハードウェア スレッドの抽象化です。

構文

struct IExecutionResource;

メンバー

パブリック メソッド

名前 説明
IExecutionResource::CurrentSubscriptionLevel アクティブ化された仮想プロセッサ ルートと、この実行リソースが表す基になるハードウェア スレッドに現在関連付けられているサブスクライブ済み外部スレッドの数を返します。
IExecutionResource::GetExecutionResourceId この実行リソースが表すハードウェア スレッドの一意識別子を返します。
IExecutionResource::GetNodeId この実行リソースが属するプロセッサ ノードの一意識別子を返します。
IExecutionResource::Remove この実行リソースをリソース マネージャーに返します。

解説

実行リソースは、スタンドアロンにすることも、仮想プロセッサ ルートに関連付けることもできます。 スタンドアロンの実行リソースは、アプリケーションのスレッドによってスレッド サブスクリプションが作成されたときに作成されます。 ISchedulerProxy::SubscribeThread メソッドと ISchedulerProxy::RequestInitialVirtualProcessors メソッドは、スレッド サブスクリプションを作成し、そのサブスクリプションを表す IExecutionResource インターフェイスを返します。 スレッド サブスクリプションの作成は、特定のスレッドがスケジューラのキューに登録されている作業、およびリソース マネージャーがスケジューラに割り当てている仮想プロセッサ ルートに参加することを、リソース マネージャーに通知する方法です。 リソース マネージャーはこの情報を使用して、ハードウェア スレッドのオーバーサブスクリプションが発生する可能性がある場合にこれを回避します。

継承階層

IExecutionResource

要件

ヘッダー: concrtrm.h

名前空間: concurrency

IExecutionResource::CurrentSubscriptionLevel メソッド

アクティブ化された仮想プロセッサ ルートと、この実行リソースが表す基になるハードウェア スレッドに現在関連付けられているサブスクライブ済み外部スレッドの数を返します。

virtual unsigned int CurrentSubscriptionLevel() const = 0;

戻り値

現在のサブスクリプション レベル。

解説

サブスクリプション レベルは、ハードウェア スレッドに関連付けられている実行中のスレッドの数を示します。 これには、サブスクライブ済みのスレッドとしてリソース マネージャーが認識しているスレッドと、スレッド プロキシをアクティブに実行している仮想プロセッサ ルートだけが含まれます。

ISchedulerProxy::SubscribeCurrentThread メソッドを呼び出すか、doSubscribeCurrentThread パラメーターを値 true に設定して ISchedulerProxy::RequestInitialVirtualProcessors メソッドを呼び出すと、ハードウェア スレッドのサブスクリプション レベルが 1 つインクリメントされます。 また、サブスクリプションを表す IExecutionResource インターフェイスも返されます。 これに対応する IExecutionResource::Remove を呼び出すと、ハードウェア スレッドのサブスクリプション レベルが 1 つデクリメントされます。

IVirtualProcessorRoot::Activate メソッドを使用して仮想プロセッサ ルートをアクティブ化する操作によって、ハードウェア スレッドのサブスクリプション レベルが 1 つインクリメントされます。 IVirtualProcessorRoot::Deactivate メソッド、または IExecutionResource::Remove メソッドを、アクティブ化された仮想プロセッサ ルートで呼び出すと、サブスクリプション レベルが 1 つデクリメントされます。

リソース マネージャーは、スケジューラ間でリソースを移動するタイミングを決定する方法の 1 つとして、このサブスクリプション レベル情報を使用します。

IExecutionResource::GetExecutionResourceId メソッド

この実行リソースが表すハードウェア スレッドの一意識別子を返します。

virtual unsigned int GetExecutionResourceId() const = 0;

戻り値

この実行リソースの基になるハードウェア スレッドの一意識別子。

解説

各ハードウェア スレッドには、同時実行ランタイムによって一意識別子が割り当てられます。 ハードウェア スレッドに複数の実行リソースが関連付けられている場合、それらの実行リソース識別子はすべて同じになります。

IExecutionResource::GetNodeId メソッド

この実行リソースが属するプロセッサ ノードの一意識別子を返します。

virtual unsigned int GetNodeId() const = 0;

戻り値

プロセッサ ノードの一意識別子。

解説

この同時実行ランタイムは、システム上のプロセッサ ノード グループ内のハードウェア スレッドを表します。 ノードは通常、システムのハードウェア トポロジから派生します。 たとえば、特定のソケットまたは特定の NUMA ノード上のすべてのプロセッサは、同じプロセッサ ノードに属すことができます。 リソース マネージャーは、0 から nodeCount - 1 まで (nodeCount - 1 を含む) の一意識別子をこれらのノードに割り当てます。ここで、nodeCount はシステム上のプロセッサ ノードの総数を表します。

ノードの数は、GetProcessorNodeCount 関数から取得できます。

IExecutionResource::Remove メソッド

この実行リソースをリソース マネージャーに返します。

virtual void Remove(_Inout_ IScheduler* pScheduler) = 0;

パラメーター

pScheduler
この実行リソースの削除を要求するスケジューラへのインターフェイス。

解説

このメソッドを使用して、スタンドアロンの実行リソースと、仮想プロセッサ ルートに関連付けられている実行リソースをリソース マネージャーに返します。

これが ISchedulerProxy::SubscribeCurrentThread メソッドまたは ISchedulerProxy::RequestInitialVirtualProcessors メソッドから受け取ったスタンドアロンの実行リソースである場合、Remove メソッドを呼び出すことによって、示すためにリソースを作成したスレッド サブスクリプションが終了します。 スケジューラ プロキシをシャットダウンする前に、すべてのスレッド サブスクリプションを終了する必要があります。また、サブスクリプションを作成したスレッドから Remove を呼び出す必要があります。

IVirtualProcessorRoot インターフェイスは IExecutionResource インターフェイスを継承しているため、Remove メソッドを呼び出すことで、仮想プロセッサ ルートもリソース マネージャーに返すことができます。 仮想プロセッサ ルートは、IScheduler::RemoveVirtualProcessors メソッドの呼び出しへの応答で、または ISchedulerProxy::CreateOversubscriber メソッドから取得したオーバーサブスクリプション状態の仮想プロセッサ ルートの終了時に、返す必要が生じる場合があります。 仮想プロセッサ ルートの場合、Remove メソッドを呼び出すことができるスレッドに制限はありません。

pScheduler パラメーターが NULL に設定されている場合は invalid_argument がスローされます。

pScheduler パラメーターが、この実行リソースが作成されたスケジューラと異なるときや、スタンドアロンの実行リソースの場合で、現在のスレッドがスレッド サブスクリプションを作成したスレッドと異なるときは、invalid_operation がスローされます。

関連項目

コンカレンシー名前空間
IVirtualProcessorRoot 構造体