個々のタスクまたはタスクグループに優先度レベルを割り当てることができます。ライブラリーは、3 つのレベル {low, normal, high} と 2 種類の優先度をサポートしています。
前者は task::enqueue() メソッドのオプションの引数として指定され、特定のタスクのみに影響します。優先度は後から変更できます。優先度が高いタスクは、優先度が低いタスクの前にキューから出されます。後者は、グループのすべてのタスクに影響します。優先度は、関連付けられている task_group_context オブジェクトから、またはグループに属するすべてのタスクからいつでも変更できます。task_group_context の優先度に関連するメソッドは、「task_group_context」セクションで説明しています。タスク・スケジューラーは準備ができているタスク (キューに入れられたタスクとスポーンされたタスクの両方) の最も高い優先度を確認して、優先度の高いタスクがすべて実行されるまで、優先度の低いタスクの実行を延期します。デフォルトでは、すべてのタスクとタスクグループは優先度 normal で作成されます。
優先度の変更は、すべてのスレッドで直ちに有効にならない場合があります。このため、優先度の高いタスクがある場合でも、しばらくの間、優先度の低いタスクが実行されることがあります。
いくつかのユーザースレッド (マスター) が同時に並列アルゴリズムを実行すると、ワーカースレッドのプールは要求された並列化レベルに比例して分割されます。優先度が異なるタスクがある場合、ワーカースレッドのプールは最初に最も優先度が高いマスター間で比例して分割されます。これらの最も優先度が高いマスターの要求を完全に満たした場合のみ、残りのスレッドがほかのマスターに提供されます。
優先度の低いマスターはワーカースレッドなしになりますが、マスタースレッドが自身をストールすることはありません。タスクの優先度は、OS スレッドの優先度設定に影響を与えません。また、OS スレッドの優先度設定の影響も受けません。
あるマスタースレッドから別のマスタースレッドへのワーカースレッドの移行は、直ちに行われないことがあります。
関連する定数とメソッド
namespace tbb { enum priority_t { priority_normal = implementation-defined, priority_low = implementation-defined, priority_high = implementation-defined }; class task { // . . . static void enqueue( task&, priority_t ); void set_group_priority ( priority_t ); priority_t group_priority () const; // . . . }; }
メンバー | 説明 |
---|---|
void enqueue ( task& t, priority_t p ) const |
タスク t を優先度レベル p でキューに入れます。 注キューに入れられたタスクの優先度は、task::enqueue() が呼び出されたタスクグループ、つまり、task::self() メソッドで返されたタスクが属するグループの優先度に影響を与えません。 |
void set_group_priority ( priority_t ) |
このタスクが属する、タスクグループの優先度を変更します。 |
priority_t group_priority () const |
戻り値: このタスクが属する、タスクグループの優先度。 |