スケジュール グループ
このドキュメントでは、同時実行ランタイムでのスケジュール グループの役割について説明します。 スケジュール グループは、関連するタスクを関連付け、またはグループ化します。 すべてのスケジューラには、1 つ以上のスケジュール グループがあります。 スケジュール グループは、タスク間で高いレベルの局所性が求められる場合 (たとえば、関連するタスクのグループが同一プロセッサ ノードでの実行によって恩恵を受ける場合) に使用します。 逆に、アプリケーションに特定の品質要件がある場合 (たとえば、一連のタスクに割り当てられる処理リソースの量を制限する場合など)、スケジューラ インスタンスを使用します。 スケジューラ インスタンスの詳細については、「スケジューラ インスタンス」を参照してください。
ヒント
コンカレンシー ランタイムには既定のスケジューラが用意されているため、アプリケーションにスケジューラを作成する必要はありません。 タスク スケジューラを使用すると、アプリケーションのパフォーマンスを微調整できるため、同時実行ランタイムを初めて使用する場合は、並列パターン ライブラリ (PPL) または非同期エージェント ライブラリから始めることをお勧めします。
すべての Scheduler
オブジェクトには、すべてのスケジュール ノードの既定のスケジュール グループがあります。 スケジューリング ノードは、基になるシステム トポロジにマップされます。 ランタイムは、すべてのプロセッサ パッケージまたは Non-Uniform Memory Architecture (NUMA) ノードの、どちらか数が多い方に対して、1 つのスケジューリング ノードを作成します。 タスクをスケジュール グループに明示的に関連付けない場合、スケジューラはタスクを追加するグループを選択します。
SchedulingProtocol
スケジューラ ポリシーは、スケジューラが各スケジュール グループのタスクを実行する順序に影響します。 SchedulingProtocol
が EnhanceScheduleGroupLocality
(既定値) に設定されている場合、タスク スケジューラは、現在のタスクが終了または協調的に停止するときに、作業しているスケジュール グループから次のタスクを選択します。 タスク スケジューラは、次に使用可能なグループに移動する前に、現在のスケジュール グループで作業を検索します。 逆にいうと、SchedulingProtocol
が EnhanceForwardProgress
に設定されている場合、各タスクが終了または停止された後、スケジューラは次のスケジュール グループに移動します。 これらのポリシーを比較する例については、「方法: スケジュール グループを使用して実行順序に影響を与える」を参照してください。
ランタイムは、concurrency::ScheduleGroup クラスを使用して、スケジュール グループを表します。 ScheduleGroup
オブジェクトを作成するには、concurrency::CurrentScheduler::CreateScheduleGroup または concurrency::Scheduler::CreateScheduleGroup メソッドを呼び出します。 ランタイムは、Scheduler
オブジェクトと同様に、参照カウント メカニズムを使用して、ScheduleGroup
オブジェクトの有効期間を制御します。 ScheduleGroup
オブジェクトを作成すると、ランタイムは参照カウンターを 1 に設定します。 concurrency::ScheduleGroup::Reference メソッドは、参照カウンターを 1 ずつ増やします。 concurrency::ScheduleGroup::Release メソッドは、参照カウンターを 1 ずつ減らします。
同時実行ランタイムの多くの型により、オブジェクトをスケジュール グループに関連付けすることができます。 たとえば、concurrency::agent クラスと、concurrency::unbounded_buffer、concurrency::join、および concurrency::timer などのメッセージ ブロック クラスは、ScheduleGroup
オブジェクトを受け取るコンストラクターのオーバーロードされたバージョンを提供します。 ランタイムは、ScheduleGroup
オブジェクトに関連付けられている Scheduler
オブジェクトを使用してタスクをスケジュールします。
concurrency::ScheduleGroup::ScheduleTask メソッドを使用して、軽量タスクをスケジュールすることもできます。 軽量タスクの詳細については、「軽量タスク」を参照してください。
例
スケジュール グループを使用してタスクの実行順序を制御する例については、「方法: スケジュール グループを使用して実行順序に影響を与える」を参照してください。