Context クラス
実行コンテキストの抽象化を表します。
構文
class Context;
メンバー
保護されたコンストラクター
名前 | 説明 |
---|---|
~Context デストラクター |
パブリック メソッド
名前 | 説明 |
---|---|
ブロック | 現在のコンテキストをブロックします。 |
CurrentContext | 現在のコンテキストへのポインターを返します。 |
GetId | コンテキストが属するスケジューラ内で一意のコンテキストの識別子を返します。 |
GetScheduleGroupId | コンテキストが現在実行されているスケジュール グループの識別子を返します。 |
GetVirtualProcessorId | コンテキストが現在実行されている仮想プロセッサの識別子を返します。 |
Id | 現在のコンテキストが属するスケジューラ内で一意の現在のコンテキストの識別子を返します。 |
IsCurrentTaskCollectionCanceling | 現在のコンテキストで現在インラインで実行されているタスク コレクションがアクティブなキャンセル処理中である (または間もなくキャンセル処理が開始される) かどうかを示す値を返します。 |
IsSynchronouslyBlocked | コンテキストが同期的にブロックされているかどうかを判断します。 コンテキストがブロックを引き起こしたアクションを明示的に実行した場合、そのコンテキストは同期的にブロックされていると見なされます。 |
Oversubscribe | スケジューラの仮想プロセッサのいずれかで実行されるコンテキストで呼び出された場合に、コード ブロックの期間中、追加の仮想プロセッサをそのスケジューラに挿入します。 |
ScheduleGroupId | 現在のコンテキストが実行されているスケジュール グループの識別子を返します。 |
Unblock | コンテキストのブロックを解除し、実行できるようにします。 |
VirtualProcessorId | 現在のコンテキストが実行されている仮想プロセッサの識別子を返します。 |
Yield | 別のコンテキストが実行できるように実行を譲歩します。 実行の権利を譲る他のコンテキストが存在しない場合、スケジューラによって別のオペレーティング システム スレッドに明け渡されます。 |
解説
同時実行ランタイム スケジューラ (Scheduler に関するページを参照) は、実行コンテキストを使用して、お使いのアプリケーションによってキューに入れられた作業を実行します。 Win32 スレッドは、Windows オペレーティング システムの実行コンテキストの例です。
スケジューラのコンカレンシー レベルは、リソース マネージャーによって許可された仮想プロセッサの数と常に等しくなります。 仮想プロセッサとは、処理リソースを抽象化したものであり、基になるシステムのハードウェア スレッドに対応しています。 指定された時点に 1 つの仮想プロセッサで実行できるスケジューラ コンテキストは 1 つのみです。
スケジューラは本質的に協調的であるため、実行コンテキストが待機状態になると、常に仮想プロセッサを別のコンテキストに渡す可能性があります。 待機状態が終了すると、スケジューラの使用可能な仮想プロセッサが実行を開始するまで再開できません。
継承階層
Context
要件
ヘッダー: concrt.h
名前空間: concurrency
ブロック
現在のコンテキストをブロックします。
static void __cdecl Block();
解説
呼び出し元のコンテキストにスケジューラが現在関連付けられていない場合、このメソッドを呼び出すと、プロセスの既定のスケジューラが作成されるか、または呼び出し元コンテキストにアタッチされます。
呼び出し元のコンテキストが仮想プロセッサ上で実行されている場合、その仮想プロセッサは、実行可能な別のコンテキストを見つけて実行するか、新しいコンテキストを作成する可能性があります。
Block
メソッドの呼び出し後に、もう一度そのメソッドを実行するには、それを、他の実行コンテキストからの Unblock メソッドの呼び出しと組み合わせる必要があります。 コードがそのコンテキストを公開して他のスレッドが Unblock
メソッドを呼び出せるようにするポイントと、Block
への実際のメソッド呼び出しが行われるポイントの間には、重要な期間があることに注意してください。 この期間中は、独自の理由 (ロックの取得など) でブロックとブロック解除を行う可能性のあるメソッドを呼び出さないでください。 Block
メソッドと Unblock
メソッドの呼び出しでは、ブロックとブロック解除の理由は追跡されません。 Block
- Unblock
ペアの所有権を持つオブジェクトは、1 つだけにする必要があります。
このメソッドは、scheduler_resource_allocation_error など、さまざまな例外をスローする可能性があります。
~Context
virtual ~Context();
CurrentContext
現在のコンテキストへのポインターを返します。
static Context* __cdecl CurrentContext();
戻り値
現在のコンテキストへのポインター。
解説
呼び出し元のコンテキストにスケジューラが現在関連付けられていない場合、このメソッドを呼び出すと、プロセスの既定のスケジューラが作成されるか、または呼び出し元コンテキストにアタッチされます。
GetId
コンテキストが属するスケジューラ内で一意のコンテキストの識別子を返します。
virtual unsigned int GetId() const = 0;
戻り値
コンテキストが属するスケジューラ内で一意のコンテキストの識別子。
GetScheduleGroupId
コンテキストが現在実行されているスケジュール グループの識別子を返します。
virtual unsigned int GetScheduleGroupId() const = 0;
戻り値
コンテキストが現在実行されているスケジュール グループの識別子。
解説
このメソッドからの戻り値は、コンテキストが実行されているスケジュール グループの瞬間的なサンプリングです。 このメソッドが現在のコンテキスト以外のコンテキストで呼び出された場合、値は返された瞬間に古くなる可能性があり、依存することはできません。 通常、このメソッドは、デバッグまたはトレースの目的でのみ使用されます。
GetVirtualProcessorId
コンテキストが現在実行されている仮想プロセッサの識別子を返します。
virtual unsigned int GetVirtualProcessorId() const = 0;
戻り値
現在のコンテキストが仮想プロセッサ上で実行されている場合は、そのコンテキストが現在実行されている仮想プロセッサの識別子。それ以外の場合は、値 -1
。
解説
このメソッドからの戻り値は、コンテキストが実行されている仮想プロセッサの瞬間的なサンプリングです。 この値は、返された瞬間に古くなる可能性があり、依存することはできません。 通常、このメソッドは、デバッグまたはトレースの目的でのみ使用されます。
Id
現在のコンテキストが属するスケジューラ内で一意の現在のコンテキストの識別子を返します。
static unsigned int __cdecl Id();
戻り値
現在のコンテキストがスケジューラにアタッチされている場合は、現在のコンテキストが属するスケジューラ内で一意の現在のコンテキストの識別子。それ以外の場合は、値 -1
。
IsCurrentTaskCollectionCanceling
現在のコンテキストで現在インラインで実行されているタスク コレクションがアクティブなキャンセル処理中である (または間もなくキャンセル処理が開始される) かどうかを示す値を返します。
static bool __cdecl IsCurrentTaskCollectionCanceling();
戻り値
スケジューラが呼び出し元のコンテキストにアタッチされていて、タスク グループがそのコンテキスト上でインラインでタスクを実行している場合、現在のコンテキストで現在インラインで実行されているタスク コレクションが、アクティブなキャンセル処理中である (または、まもなくキャンセル処理を開始する) かどうかを示す値。それ以外の場合は、値 false
。
IsSynchronouslyBlocked
コンテキストが同期的にブロックされているかどうかを判断します。 コンテキストがブロックを引き起こしたアクションを明示的に実行した場合、そのコンテキストは同期的にブロックされていると見なされます。
virtual bool IsSynchronouslyBlocked() const = 0;
戻り値
コンテキストが同期的にブロックされているかどうか。
解説
コンテキストがブロックを引き起こしたアクションを明示的に実行した場合、そのコンテキストは同期的にブロックされていると見なされます。 スレッド スケジューラ上で、これは Context::Block
メソッドの直接の呼び出し、または Context::Block
メソッドを使用してビルドされた同期オブジェクトの呼び出しを示します。
このメソッドからの戻り値は、コンテキストが同期的にブロックされているかの瞬間的なサンプルです。 この値は、返される瞬間に古くなる可能性があり、非常に限定的な状況でのみ使用できます。
operator delete
Context
オブジェクトは、ランタイムによって内部的に破棄されます。 これを明示的に削除することはできません。
void operator delete(void* _PObject);
パラメーター
_PObject
削除するオブジェクトへのポインター。
Oversubscribe
スケジューラの仮想プロセッサのいずれかで実行されるコンテキストで呼び出された場合に、コード ブロックの期間中、追加の仮想プロセッサをそのスケジューラに挿入します。
static void __cdecl Oversubscribe(bool _BeginOversubscription);
パラメーター
_BeginOversubscription
true
の場合、オーバーサブスクリプション中に追加の仮想プロセッサを追加する必要があることを示します。 false
の場合、オーバーサブスクリプションを終了し、以前に追加した仮想プロセッサを削除する必要があることを示します。
ScheduleGroupId
現在のコンテキストが実行されているスケジュール グループの識別子を返します。
static unsigned int __cdecl ScheduleGroupId();
戻り値
現在のコンテキストがスケジューラにアタッチされ、スケジュール グループ上で動作している場合は、現在のコンテキストが実行されているスケジュール グループの識別子。それ以外の場合は、値 -1
。
Unblock
コンテキストのブロックを解除し、実行できるようにします。
virtual void Unblock() = 0;
解説
Unblock
メソッドの呼び出しが、対応する Block メソッドの呼び出しよりも先に行われることは、完全に認められています。 Block
メソッドと Unblock
メソッドの呼び出しのペアが適切な場合、自然な競合はどちらの順序でもランタイムによって適切に処理されます。 Block
呼び出しの前に Unblock
呼び出しがあった場合は、単に Block
呼び出しの効果が否定されます。
このメソッドからスローされる例外はいくつかあります。 コンテキストがそれ自体で Unblock
メソッドを呼び出そうとすると、context_self_unblock 例外がスローされます。 Block
と Unblock
の呼び出しが適切にペアになっていない場合 (たとえば、現在実行されているコンテキストに対して Unblock
の呼び出しが 2 回行われた場合) は、context_unblock_unbalanced 例外がスローされます。
コードがそのコンテキストを公開して他のスレッドが Unblock
メソッドを呼び出せるようにするポイントと、Block
への実際のメソッド呼び出しが行われるポイントの間には、重要な期間があることに注意してください。 この期間中は、独自の理由 (ロックの取得など) でブロックとブロック解除を行う可能性のあるメソッドを呼び出さないでください。 Block
メソッドと Unblock
メソッドの呼び出しでは、ブロックとブロック解除の理由は追跡されません。 Block
と Unblock
ペアの所有権を持つオブジェクトは、1 つだけにする必要があります。
VirtualProcessorId
現在のコンテキストが実行されている仮想プロセッサの識別子を返します。
static unsigned int __cdecl VirtualProcessorId();
戻り値
現在のコンテキストがスケジューラにアタッチされている場合は、現在のコンテキストが実行されている仮想プロセッサの識別子。それ以外の場合は、値 -1
。
解説
このメソッドからの戻り値は、現在のコンテキストが実行されている仮想プロセッサの瞬間的なサンプリングです。 この値は、返された瞬間に古くなる可能性があり、依存することはできません。 通常、このメソッドは、デバッグまたはトレースの目的でのみ使用されます。
Yield
別のコンテキストが実行できるように実行を譲歩します。 実行の権利を譲る他のコンテキストが存在しない場合、スケジューラによって別のオペレーティング システム スレッドに明け渡されます。
static void __cdecl Yield();
解説
呼び出し元のコンテキストにスケジューラが現在関連付けられていない場合、このメソッドを呼び出すと、プロセスの既定のスケジューラが作成されるか、または呼び出し元コンテキストにアタッチされます。
YieldExecution
別のコンテキストが実行できるように実行を譲歩します。 実行の権利を譲る他のコンテキストが存在しない場合、スケジューラによって別のオペレーティング システム スレッドに明け渡されます。
static void __cdecl YieldExecution();
解説
呼び出し元のコンテキストにスケジューラが現在関連付けられていない場合、このメソッドを呼び出すと、プロセスの既定のスケジューラが作成されるか、または呼び出し元コンテキストにアタッチされます。
この関数は Visual Studio 2015 で新たに追加されたもので、Yield 関数と同様ですが、Windows.h の Yield マクロと競合しません。