スケジューラ ポリシー
ここでは、同時実行ランタイムでのスケジューラ ポリシーの役割について説明します。スケジューラでタスクを管理する場合、スケジューラ ポリシーによって、スケジューラが使用する方法を制御します。いくつかのタスクを実行するを必要とするアプリケーションの例を示しますTHREAD_PRIORITY_NORMALその他のタスクを実行するのにはTHREAD_PRIORITY_HIGHEST。スケジューラの 2 つのインスタンスを作成することができます。 1 を指定、 ContextPriorityにTHREAD_PRIORITY_NORMALと別に、同じポリシーを指定THREAD_PRIORITY_HIGHEST。
スケジューラ ポリシーを使用して、使用可能な処理リソースを分割して各スケジューラには固定の一連のリソースを割り当てることができます。たとえば、4 つまでのプロセッサに対応した並列アルゴリズムを考えてみます。この場合、タスクで同時に使用されるプロセッサを 4 つまでに制限するスケジューラ ポリシーを作成できます。
ヒント |
---|
同時実行制御のランタイムは、既定のスケジューラが用意されています。したがって、アプリケーションで作成する必要はありません。タスク スケジューラではアプリケーションのパフォーマンスを微調整できるため、同時実行ランタイムを初めて使用する場合は、並列パターン ライブラリ (PPL) または非同期エージェント ライブラリから始めることをお勧めします。 |
使用すると、 concurrency::CurrentScheduler::Create、 concurrency::Scheduler::Create、または concurrency::Scheduler::SetDefaultSchedulerPolicy で、スケジューラのインスタンスを作成する方法を concurrency::SchedulerPolicy 、スケジューラの動作を指定するキー/値ペアのコレクションを格納するオブジェクト。SchedulerPolicy コンストラクターは、可変個の引数を受け取ります。1 番目の引数は、指定するポリシー要素の数です。残りの引数は、各ポリシー要素を表すキーと値のペアです。次の例では、3 つのポリシー要素を指定する SchedulerPolicy オブジェクトが作成されます。ランタイムはありません指定されたポリシー キーの既定値を使用します。
SchedulerPolicy policy(3,
MinConcurrency, 2,
MaxConcurrency, 4,
ContextPriority, THREAD_PRIORITY_HIGHEST
);
Concurrency::PolicyElementKey 列挙体の定義は、タスク スケジューラを関連付けられているポリシーのキー。次の表で、ポリシー キーと、ランタイムが各ポリシー キーに対して使用する既定値について説明します。
ポリシー キー |
Description |
既定値 |
---|---|---|
SchedulerKind |
A concurrency::SchedulerType を使用してタスクのスケジュールを設定するスレッドの種類を指定する値。 |
ThreadScheduler(通常のスレッドを使用します。)これは、唯一の有効値をこのキーです。 |
MaxConcurrency |
スケジューラが使用する同時実行リソースの最大数を指定する unsigned int 値。 |
|
MinConcurrency |
スケジューラが使用する同時実行リソースの最小数を指定する unsigned int 値。 |
1 |
TargetOversubscriptionFactor |
各処理リソースに割り当てるスレッドの数を指定する unsigned int 値。 |
1 |
LocalContextCacheSize |
各仮想プロセッサのローカル キューにキャッシュすることができるコンテキストの最大数を指定する unsigned int 値。 |
8 |
ContextStackSize |
各コンテキスト用に予約するスタックのサイズ (キロバイト単位) を指定する unsigned int 値。 |
0 (既定のスタック サイズを使用) |
ContextPriority |
各コンテキストのスレッド優先順位を指定する int 値。これには、SetThreadPriority または INHERIT_THREAD_PRIORITY に渡すことができる任意の値を使用できます。 |
THREAD_PRIORITY_NORMAL |
SchedulingProtocol |
A concurrency::SchedulingProtocolType を使用するのには、スケジュー リング アルゴリズムを指定する値。 |
EnhanceScheduleGroupLocality |
DynamicProgressFeedback |
A concurrency::DynamicProgressFeedbackType 値の統計値に基づく進行状況の情報に従ってリソースのバランスをとるかどうかを指定します。 注このポリシーの設定を行うしないProgressFeedbackDisabledは、ランタイムでの使用が予約されているため。 |
ProgressFeedbackEnabled |
各スケジューラは、タスクをスケジュールするとき、独自のポリシーを使用します。1 つのスケジューラに関連付けられているポリシーは他のスケジューラの動作には影響しません。また、Scheduler オブジェクトを作成した後にスケジューラ ポリシーを変更することはできません。
重要 |
---|
ランタイムによって作成されるスレッドの属性を制御するには、スケジューラ ポリシーだけを使用します。スレッドの関係や、未定義の動作が発生する可能性がありますので、ランタイムによって作成されたスレッドの優先順位は変更されません。 |
スケジューラを明示的に作成しない場合は、ランタイムによって既定のスケジューラが作成されます。アプリケーションでは、既定のスケジューラを使用するが、ポリシーにスケジューラを使用して、呼び出しを指定するかどうかは、 concurrency::Scheduler::SetDefaultSchedulerPolicy メソッドの並列の作業のスケジュールを設定する前にします。Scheduler::SetDefaultSchedulerPolicy メソッドを呼び出さない場合、ランタイムは表の既定ポリシー値を使用します。
使用、 concurrency::CurrentScheduler::GetPolicy 、 concurrency::Scheduler::GetPolicy スケジューラのポリシーのコピーを取得するメソッド。これらのメソッドから取得するポリシー値は、スケジューラを作成するときに指定したポリシー値とは異なる場合があります。
例
特定のスケジューラ ポリシーを使用して、スケジューラの動作を制御するための例を確認するを参照してください方法: 特定のスケジューラ ポリシーを指定すると方法: 特定のスケジューラ ポリシーを使用するエージェントを作成する。
参照
処理手順
方法: 特定のスケジューラ ポリシーを使用するエージェントを作成する