this_task_arena

[scheduler.this_task_arena]

現在の task_arena に適用可能な関数の名前空間。

名前空間 this_task_arena には、呼び出し元のスレッドで使用されている task_arena と対話するグローバル関数が含まれています。


// <oneapi/tbb/task_arena.h> ヘッダーで定義 

namespace oneapi { 
namespace tbb { 
    namespace this_task_arena { 
        int current_thread_index(); 
        int max_concurrency(); 
        template<typename F> auto isolate(F&& f) -> decltype(f()); 

        void enqueue(task_handle&& h); 

        template<typename F>  void enqueue(F&& f) ; 
    } 
} // namespace tbb 
} // namespace oneapi
int current_thread_index()

呼び出し元のスレッドで使用されている task_arena のスレッド・インデックスを返します。スレッドがまだタスク・スケジューラーを初期化していない場合は task_arena::not_initialized を返します。

スレッド・インデックスは、0 から task_arena の平行レベルの整数です。スレッド・インデックスは、アリーナに参加するアプリケーション・スレッドとワーカースレッドの両方に割り当てられ、アリーナを終了するまで保持されます。アリーナを共有するスレッドのインデックスは一意です。アリーナ内の 2 つのスレッドが同じインデックスを持つことはありませんが、必ずしも連続する必要はありません。

タスクを実行しないスレッドは、いつでもアリーナを離れることがあるため、スレッドのインデックスは、同じタスクグループやアルゴリズムに属している 2 つのタスク間でも変わることがあります。

異なるアリーナを使用するスレッドは、同じインデックス値を持つことがあります。

execute() に入れ子の領域が参加すると、リターン時に外側の領域のインデックスがリストアされ、現在のインデックス値が変更されることがあります。

int max_concurrency()

呼び出しスレッドが現在使用している task_arena の同時実行レベルを返します。スレッドがタスク・スケジューラーを初期化していない場合は、ハードウェア構成に応じて自動的に決定された同時実行レベルが返ります。

template<F>
auto isolate(F &&f) -> decltype(f())

呼び出しスレッドをファンクターのスコープでスケジュールされたタスクだけを処理するように制限することで、指定されたファンクターを分離して実行します (分離領域とも呼ばれます)。関数はファンクターの戻り値を返します。F タイプは、[function.objects] ISO C++ 標準の関数オブジェクトの要件を満たしている必要があります。

警告

ファンクターによって返されたオブジェクトは参照できません。代わりに std::reference_wrapper を使用します。

template<typename F>
void enqueue(F &&f)

指定されたファンクターを処理するため、呼び出したスレッドで使用されている task_arena にタスクをエンキューしてすぐに戻ります。F タイプは、[function.objects] ISO C++ 標準の関数オブジェクトの要件を満たしている必要があります。

この関数の動作は、attach パラメーターで構築された task_arena オブジェクトに適用される template<typename F> void task_arena::enqueue(F&& f) と同じです。

void enqueue(task_handle &&h)

h が所有するタスクを、呼び出し元のスレッドが使用する task_arena にエンキューします。

この関数の動作は、パラメーター・タイプを除き、汎用バージョン (template<typename F> void enqueue(F&& f)) と同じです。

未定義の動作を避けるため、h は空であってはなりません。