#include "tbb/pipeline.h"
class thread_bound_filter;
thread_bound_filter は、特定のスレッドによって明示的に実行される特殊な filter です。特定のスレッドでフィルターを実行しなければならない場合に役立ちます。
thread_bound_filter は、特定のスレッドでフィルターを実行する必要がある場合のみ使用してください。thread_bound_filter は複数のスレッドで安全に使用できません。thread_bound_filter を実行するスレッドは、pipeline::run() を呼び出すスレッドであってはなりません。
namespace tbb { class thread_bound_filter: public filter { protected: thread_bound_filter(mode filter_mode); public: enum result_type { success, item_not_available, end_of_stream }; result_type try_process_item(); result_type process_item(); }; }
次のサンプルは、2 つのフィルターを持つパイプラインで、2 つ目のフィルターはメインスレッドによって実行される thread_bound_filter です。
#include <iostream> #include "tbb/pipeline.h" #include "tbb/compat/thread" #include "tbb/task_scheduler_init.h" using namespace tbb; char InputString[] = "abcdefg\n"; class InputFilter: public filter { char* my_ptr; public: void* operator()(void*) { if (*my_ptr) return my_ptr++; else return NULL; } InputFilter() : filter( serial_in_order ), my_ptr(InputString) {} }; class OutputFilter: public thread_bound_filter { public: void* operator()(void* item) { std::cout << *(char*)item; return NULL; } OutputFilter() : thread_bound_filter(serial_in_order) {} }; void RunPipeline(pipeline* p) { p->run(8); } int main() { // パイプラインを構築 InputFilter f; OutputFilter g; pipeline p; p.add_filter(f); p.add_filter(g); // 別のスレッドでパイプラインの実行を開始 std::thread t(RunPipeline,&p); // 現在のスレッドで thread_bound_filter を処理 while (g.process_item()!=thread_bound_filter::end_of_stream) continue; // パイプラインがほかのスレッドで終了するのを待つ t.join(); return 0; }
メインスレッドは、パイプラインを構築した後に次のことを行います。
メインスレッドは thread_bound_filter g を実行しなければならないため、パイプラインは別のスレッドによって実行されます。この 2 つのスレッドの役割を逆にすることはできますが、1 つのスレッドで両方の役割を果たすことはできません。
メンバー | 説明 | ||||||||
---|---|---|---|---|---|---|---|---|---|
thread_bound_filter(mode filter_mode)() |
指定されたモードのフィルターを構築します。モードについては「pipeline クラス」セクションを参照してください。filter_mode 引数は、serial_in_order または serial_out_of_order でなければなりません。 注意parallel として作成された thread_bound_filter を使用する場合、プログラムの動作は定義されません。 |
||||||||
result_type try_process_item() |
処理可能なアイテムがあり、トークンの制限を越えることなく処理できる場合は、filter::operator() を使用してそのアイテムを処理します。次の表は、戻り値の詳細を示します。
|
||||||||
result_type process_item() |
try_process_item に似ていますが、アイテムが処理可能になるか、ストリームの最後に達するまで待機します。 戻り値: success または end_of_stream。詳細は、上記の表を参照してください。 注現在の実装では、アイテムが処理可能になるか、ストリームの最後に達するまでセマフォーでブロックします。 |