task_scheduler_init クラスの拡張

概要

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 を返します。

ブロックを正常に終了するには、次の条件を満たす必要があります。

これらの条件の下では、すべてのワーカースレッドが完了した時点で、少なくとも 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;
}

関連情報