タスク・スケジュール・サービスにおけるスレッドの状態を明示的に表すクラス。
class task_scheduler_init;
#include "tbb/task_scheduler_init.h"
task_scheduler_init の使用は、インテル® TBB 2.2 ではオプションです。デフォルトでは、インテル® TBB 2.2 は、スレッドが最初にタスク・スケジュール・サービスを使用するときにタスク・スケジューラーを自動的に作成し、スレッドが最後に終了するときにタスク・スケジューラーを破棄します。
task_scheduler_init のインスタンスは、次のような場合に使用できます。
タスク・スケジューラーの構築と破棄を制御する。
タスク・スケジューラーで使用するスレッド数を指定する。
ワーカースレッドのスタックサイズを指定する。
タスク・スケジュールのデフォルトの動作をオーバーライドするには、タスク・スケジュール・サービスを最初に使用する前に task_scheduler_init がアクティブになっていなければなりません。
task_scheduler_init は、"アクティブ" または "インアクティブ" のいずれかです。
task_scheduler_init のデフォルト・コンストラクターはオブジェクトをアクティブにし、デストラクターはオブジェクトを非アクティブにします。初期化を遅らせるには、コンストラクターに task_scheduler_init::deferred 値を渡します。この場合、task_scheduler_init は initialize メソッドを呼び出して、後で初期化されます。初期化された task_scheduler_init の破棄は、オブジェクトを暗黙的に非アクティブにします。オブジェクトをより早く非アクティブにするには、terminate メソッドを呼び出します。
コンストラクターのオプション引数および initialize メソッドでタスク実行に使用されるスレッド数を指定できます。 この引数は開発中にスケーリングを調査するのに役立ちますが、製品には設定しないでください。
製品コードでスレッド数を指定しない理由は、大規模なソフトウェア・プロジェクトでは、さまざまなコンポーネントでほかのスレッドに対する最適なスレッド数を知る方法がないためです。ハードウェア・スレッドは、共有グローバルリソースであるため、タスク・スケジューラーにスレッド数の制御を任せるのが最良の方法です。
タスク・スケジューラーは、初期化中に現在のスレッドから浮動小数点設定を取得します。取得した浮動小数点設定は、すべてのワーカースレッドに伝えられます。詳細は、「浮動小数点設定」セクションを参照してください。
時間のオーバーヘッドを最小限にするには、スレッドがすべてのライブラリーのタスク・スケジュールをアクティブ化して使用する間は単一の task_scheduler_init オブジェクトを作成することがベストです。task_scheduler_init は、コピー構築や割り当てはできません。
// スケーリング研究を行う 1 つの方法のスケッチ #include <iostream> #include "tbb/task_scheduler_init.h" int main() { int n = task_scheduler_init::default_num_threads(); for( int p=1; p<=n; ++p ) { // p スレッドのタスク・スケジューラーを構築 task_scheduler_init init(p); tick_count t0 = tick_count::now(); ... タスクを使用する並列アルゴリズムまたは テンプレート・アルゴリズムを実行 ... tick_count t1 = tick_count::now(); double t = (t1-t0).seconds(); cout << "時間 = " << t << " 秒 " << p << "スレッド\n"; // タスク・スケジューラーを暗黙的に破棄 } return 0; }
namespace tbb { typedef unsigned-integral-type stack_size_type; class task_scheduler_init { public: static const int automatic = implementation-defined; static const int deferred = implementation-defined; task_scheduler_init( int max_threads=automatic, stack_size_type thread_stack_size=0 ); ~task_scheduler_init(); void initialize( int max_threads=automatic ); void terminate(); static int default_num_threads(); bool is_active() const; }; } // tbb 名前空間