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
は空であってはなりません。