次の方法で共有


コンテキスト クラス

実行コンテキストの抽象化を表します。

構文

class Context;

メンバー

保護されたコンストラクター

名前 説明
~Context デストラクター

パブリック メソッド

名前 説明
ブロック 現在のコンテキストをブロックします。
CurrentContext 現在のコンテキストへのポインターを返します。
GetId コンテキストが属するスケジューラ内で一意のコンテキストの識別子を返します。
GetScheduleGroupId コンテキストが現在実行されているスケジュール グループの識別子を返します。
GetVirtualProcessorId コンテキストが現在実行されている仮想プロセッサの識別子を返します。
Id 現在のコンテキストが属するスケジューラ内で一意の現在のコンテキストの識別子を返します。
IsCurrentTaskCollectionCanceling(現在のタスクコレクションのキャンセル状況を確認) 現在のコンテキストで現在インラインで実行されているタスク コレクションがアクティブなキャンセル処理中である (または間もなくキャンセル処理が開始される) かどうかを示す値を返します。
IsSynchronouslyBlocked コンテキストが同期的にブロックされているかどうかを判断します。 コンテキストがブロックを引き起こしたアクションを明示的に実行した場合、そのコンテキストは同期的にブロックされていると見なされます。
オーバースブスクライブ スケジューラの仮想プロセッサのいずれかで実行されるコンテキストで呼び出された場合に、コード ブロックの期間中、追加の仮想プロセッサをそのスケジューラに挿入します。
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

解説

このメソッドからの戻り値は、コンテキストが実行されている仮想プロセッサの瞬間的なサンプリングです。 この値は、返された瞬間に古くなる可能性があり、依存することはできません。 通常、このメソッドは、デバッグまたはトレースの目的でのみ使用されます。

識別子

現在のコンテキストが属するスケジューラ内で一意の現在のコンテキストの識別子を返します。

static unsigned int __cdecl Id();

戻り値

現在のコンテキストがスケジューラにアタッチされている場合は、現在のコンテキストが属するスケジューラ内で一意の現在のコンテキストの識別子。それ以外の場合は、値 -1

IsCurrentTaskCollectionCanceling

現在のコンテキストで現在インラインで実行されているタスク コレクションがアクティブなキャンセル処理中である (または間もなくキャンセル処理が開始される) かどうかを示す値を返します。

static bool __cdecl IsCurrentTaskCollectionCanceling();

戻り値

スケジューラが呼び出し元のコンテキストにアタッチされていて、タスク グループがそのコンテキスト上でインラインでタスクを実行している場合、現在のコンテキストで現在インラインで実行されているタスク コレクションが、アクティブなキャンセル処理中である (または、まもなくキャンセル処理を開始する) かどうかを示す値。それ以外の場合は、値 false

同期的にブロックされているか

コンテキストが同期的にブロックされているかどうかを判断します。 コンテキストがブロックを引き起こしたアクションを明示的に実行した場合、そのコンテキストは同期的にブロックされていると見なされます。

virtual bool IsSynchronouslyBlocked() const = 0;

戻り値

コンテキストが同期的にブロックされているかどうか。

解説

コンテキストがブロックを引き起こしたアクションを明示的に実行した場合、そのコンテキストは同期的にブロックされていると見なされます。 スレッド スケジューラ上で、これは Context::Block メソッドの直接の呼び出し、または Context::Block メソッドを使用してビルドされた同期オブジェクトの呼び出しを示します。

このメソッドからの戻り値は、コンテキストが同期的にブロックされているかの瞬間的なサンプルです。 この値は、返される瞬間に古くなる可能性があり、非常に限定的な状況でのみ使用できます。

operator delete

Context オブジェクトは、ランタイムによって内部的に破棄されます。 これを明示的に削除することはできません。

void operator delete(void* _PObject);

パラメーター

_PObject
削除するオブジェクトへのポインター。

オーバーサブスクライブ

スケジューラの仮想プロセッサのいずれかで実行されるコンテキストで呼び出された場合に、コード ブロックの期間中、追加の仮想プロセッサをそのスケジューラに挿入します。

static void __cdecl Oversubscribe(bool _BeginOversubscription);

パラメーター

_BeginOversubscription
true の場合、オーバーサブスクリプション中に追加の仮想プロセッサを追加する必要があることを示します。 false の場合、オーバーサブスクリプションを終了し、以前に追加した仮想プロセッサを削除する必要があることを示します。

スケジュールグループID

現在のコンテキストが実行されているスケジュール グループの識別子を返します。

static unsigned int __cdecl ScheduleGroupId();

戻り値

現在のコンテキストがスケジューラにアタッチされ、スケジュール グループ上で動作している場合は、現在のコンテキストが実行されているスケジュール グループの識別子。それ以外の場合は、値 -1

ブロック解除

コンテキストのブロックを解除し、実行できるようにします。

virtual void Unblock() = 0;

解説

Unblock メソッドの呼び出しが、対応する Block メソッドの呼び出しよりも先に行われることは、完全に認められています。 Block メソッドと Unblock メソッドの呼び出しのペアが適切な場合、自然な競合はどちらの順序でもランタイムによって適切に処理されます。 Unblock 呼び出しの前に Block 呼び出しがあった場合は、単に Block 呼び出しの効果が否定されます。

このメソッドからスローされる例外がいくつかあります。 コンテキストがそれ自体で Unblock メソッドを呼び出そうとすると、context_self_unblock 例外がスローされます。 BlockUnblock の呼び出しが適切にペアになっていない場合 (たとえば、現在実行されているコンテキストに対して Unblock の呼び出しが 2 回行われた場合) は、context_unblock_unbalanced 例外がスローされます。

コードがそのコンテキストを公開して他のスレッドが Unblock メソッドを呼び出せるようにするポイントと、Block への実際のメソッド呼び出しが行われるポイントの間には、重要な期間があることに注意してください。 この期間中は、独自の理由 (ロックの取得など) でブロックとブロック解除を行う可能性のあるメソッドを呼び出さないでください。 Block メソッドと Unblock メソッドの呼び出しでは、ブロックとブロック解除の理由は追跡されません。 BlockUnblock ペアの所有権を持つオブジェクトは、1 つだけにする必要があります。

VirtualProcessorId

現在のコンテキストが実行されている仮想プロセッサの識別子を返します。

static unsigned int __cdecl VirtualProcessorId();

戻り値

現在のコンテキストがスケジューラにアタッチされている場合は、現在のコンテキストが実行されている仮想プロセッサの識別子。それ以外の場合は、値 -1

解説

このメソッドからの戻り値は、現在のコンテキストが実行されている仮想プロセッサの瞬間的なサンプリングです。 この値は、返された瞬間に古くなる可能性があり、依存することはできません。 通常、このメソッドは、デバッグまたはトレースの目的でのみ使用されます。

Yield

他のコンテキストが実行できるように制御を渡します。 他に譲るべきコンテキストが存在しない場合、スケジューラは別のオペレーティングシステムのスレッドに制御を譲ります。

static void __cdecl Yield();

解説

呼び出し元のコンテキストにスケジューラが現在関連付けられていない場合、このメソッドを呼び出すと、プロセスの既定のスケジューラが作成されるか、または呼び出し元コンテキストにアタッチされます。

実行の譲渡

他のコンテキストが実行できるように制御を渡します。 他に譲るべきコンテキストが存在しない場合、スケジューラは別のオペレーティングシステムのスレッドに制御を譲ります。

static void __cdecl YieldExecution();

解説

呼び出し元のコンテキストにスケジューラが現在関連付けられていない場合、このメソッドを呼び出すと、プロセスの既定のスケジューラが作成されるか、または呼び出し元コンテキストにアタッチされます。

この関数は Visual Studio 2015 で新たに追加されたもので、Yield 関数と同様ですが、Windows.h の Yield マクロと競合しません。

関連項目

コンカレンシー名前空間
Scheduler クラス
タスク スケジューラ