thread_bound_filter クラス

概要

スレッドが明示的に実行しなければならないパイプライン中のフィルターを表す抽象的な基本クラス。

ヘッダー

#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() を使用してそのアイテムを処理します。次の表は、戻り値の詳細を示します。

戻り値

説明

success

filter::operator() が 1 つのアイテムに適用されました。

item_not_available

処理可能なアイテムがないか、トークンの制限を越えてしまいます。

end_of_stream

このフィルターに達するアイテムはほかにありません。

result_type process_item()

try_process_item に似ていますが、アイテムが処理可能になるか、ストリームの最後に達するまで待機します。

戻り値: success または end_of_stream。詳細は、上記の表を参照してください。

現在の実装では、アイテムが処理可能になるか、ストリームの最後に達するまでセマフォーでブロックします。