#include "tbb/pipeline.h"
class thread_bound_filter;
thread_bound_filter は、特定のスレッドによって明示的に実行される特殊な 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 クラス」セクションを参照してください。 |
||||||||
| result_type try_process_item() |
処理可能な項目があり、トークンの制限を越えることなく処理できる場合は、filter::operator() を使用してその項目を処理します。 次の表は、戻り値の詳細を示します。
|
||||||||
| result_type process_item() |
try_process_item に似ていますが、項目が処理可能になるか、ストリームの最後に達するまで待機します。 戻り値: success または end_of_stream。 詳細は、上記の表を参照してください。 警告現在の実装では、項目が処理可能になるか、ストリームの最後に達するまでスピンウェイトします。 |