優先度

個々のタスクまたはタスクグループに優先度レベルを割り当てることができます。ライブラリーは、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

戻り値: このタスクが属する、タスクグループの優先度。

関連情報