task_scheduler_init クラスは、ワーカースレッドの完了を待つメソッドで拡張されます。
#define TBB_PREVIEW_WAITING_FOR_WORKERS 1 #include "tbb/task_scheduler_init.h"
void tbb::task_scheduler_init::blocking_terminate(); bool tbb::task_scheduler_init::blocking_terminate(const std::nothrow_t&) noexcept(true);
task_scheduler_init クラスの blocking_terminate メソッドは、ライブラリーにより暗黙的に作成されたすべてのワーカースレッドが完了するまで、スレッドの呼び出しをブロックします。スレッドの完了を待つことが安全でない場合 (例えば、デッドロックが発生する場合)、メソッドは失敗します。メソッドは、失敗をレポートする異なる方法を提供するため多重定義されます。
メソッド | 説明 |
---|---|
void tbb::task_scheduler_init::blocking_terminate() | すべてのワーカースレッドが完了するまでブロックします。ワーカースレッドの完了を待つことが安全でない場合、runtime_error をスローします。 |
bool tbb::task_scheduler_init::blocking_terminate(const std::nothrow_t&) noexcept(true) | すべてのワーカースレッドが完了するまでブロックします。すべてのワーカースレッドが正常に完了した場合は true、ワーカースレッドの完了を待つことが安全でない場合は false を返します。 |
ブロックを正常に終了するには、次の条件を満たす必要があります。
アクティブな (まだ完了していない) アプリケーション・スレッドがタスク・スケジューラーを自動的に初期化していない。
アクティブな (まだ終了していない) task_arena クラスのインスタンスがプログラム全体に存在しない。
blocking_terminate が task_scheduler_init クラスのすべてのアクティブなインスタンスで (異なるアプリケーション・スレッドにより) 呼び出された。
これらの条件の下では、すべてのワーカースレッドが完了した時点で、少なくとも 1 つの blocking_terminate 呼び出しが成功することが保証されます。複数のアプリケーション・スレッドで複数の呼び出しが同時に行われた場合、2 つ以上の呼び出しが成功することがあります。
プログラムに存在するアクティブな task_scheduler_init インスタンスの数が分かっている場合は、最後のインスタンス以外のすべてのインスタンスを終了した後、最後のインスタンスで blocking_terminate を呼び出すことを推奨します。
タスク、並列アルゴリズム、またはフローグラフのノードの内部で呼び出された場合、メソッドは常に失敗します。
#define TBB_PREVIEW_WAITING_FOR_WORKERS 1 #include "tbb/task_scheduler_init.h" #include "tbb/parallel_for.h" #include <iostream> int main() { tbb::task_scheduler_init init; // ここで並列処理を行う tbb::parallel_for(0, 10000, [](int){}); try { init.blocking_terminate(); // インテル® TBB のワーカースレッドを終了 } catch (const std::runtime_error&) { std::cerr << "ワーカースレッドの終了に失敗しました" << std::endl; } return 0; }