TBB ライブラリにスレッド プール パターンの実現はありますか?
いいえの場合、どこで見つけることができますか? 私がすでに見つけたオープンソースの実現のほとんどは、未完成で不安定に見えます。
TBB ライブラリにスレッド プール パターンの実現はありますか?
いいえの場合、どこで見つけることができますか? 私がすでに見つけたオープンソースの実現のほとんどは、未完成で不安定に見えます。
TBB には、自分で取得できる種類のスレッド プール クラスは含まれていません (ただし、以下を参照してください)。自分でスレッドプールを作成する必要が本当にある場合 (TBB または OpenMP が公開するより高いレベルの概念を扱いたいので、そうしないことを願っています)、おそらくこのかわいい方法を使用するでしょう。boost::asio
スレッドプール機能を提供するために使用します。
具体的にはTBBの詳細:TBBにスレッドプールが含まれている場合、それは内部実装の詳細であり、呼び出し時に特定のスレッド数(およびそれらのスタックサイズ)をオプションで指定することにより、制限された制御が可能ですtask_scheduler_init
。しかし、それを呼び出さずに TBB にそのデフォルトを使用させることは完全に可能です。
実際、ドキュメントには次のように記載されていることに注意してください。
コンストラクターとメソッド initialize へのオプションのパラメーターを使用すると、タスクの実行に使用するスレッドの数を指定できます。このパラメータは、開発中の調査のスケーリングに役立ちますが、本番環境での使用には設定しないでください。製品コードでスレッド数を指定しない理由は、大規模なソフトウェア プロジェクトでは、さまざまなコンポーネントが他のスレッドに最適なスレッド数を知る方法がないためです。ハードウェア スレッドは共有グローバル リソースです。使用するスレッド数の決定は、タスク スケジューラに任せるのが最善です。
しかし、スレッド プールについて心配している場合、またはスレッド プールを実装するために TBB が持つ明示的なスレッド オブジェクトのサポートを使用している場合は、TBB のほとんどの価値を見逃していることになります。それを活用するには、スレッドではなく、タスクとタスクの並列処理の観点から考える必要があります。
短い答え: いいえ
長い答え:
TBB スレッド クラスは、C++11 スレッドに類似した基盤となる OS スレッドの単なるラッパーです。ただし、コードの移植性には役立ちます。
代わりに、TBB が提供する高度に最適化されたタスク スケジューリングに依存する方がよいという一般的な提案に同意します。
または、新しく追加された flow_graph 構造を検討してください。
自分でスレッドを探索したい場合、停止を開始し、含まれているすべてのスレッドに参加する独自のスレッドグループ クラスをロールするのは比較的簡単です。