最終更新:
mikk_ni3_92 2008年07月27日(日) 17:59:53履歴
現在地 >> メニュー >> TBB >> TBB::pipeline処理
#include <iostream> #include <string> #include <fstream> #include <tbb/task_scheduler_init.h> #include <tbb/pipeline.h> const char *filename = "test.txt"; const int Max_token = 2; /************ 各種データ構造 ***************/ //入力用パイプラインフィルタ class InputFilter : public tbb::filter //tbb::filterを継承する { private: std::fstream &file; //参照型 std::string line; public: //コンストラクタ InputFilter(std::fstream &data):file(data),filter(true){} //オペレータの設定 void* operator()(void*) { std::getline(file,line); //1行読み込み if(file.eof()) //ファイル末尾かどうか? { return NULL; //なければNULL }else { line.append("\n"); return &line; //次のフィルタへ渡す } } }; //出力用パイプラインフィルタ class OutputFilter : public tbb::filter //継承 { private: std::fstream &output_file; public: //コンストラクタ OutputFilter( std::fstream &data ) : tbb::filter(true), output_file(data) {} //オペレータの設定 void* operator()( void* item ) { std::string &data = *static_cast<std::string *>(item); output_file << data.c_str(); return NULL; //終わりなのでNULL } }; //プロトタイプ宣言 void TbbPipelineProcess(std::fstream &fs,std::fstream &fso); //-------------- メイン関数 ------------------------// int main(int argc, char *argv[]) { std::fstream fs(filename,std::ios::in); if(fs.fail()) { std::cerr<< "Can't load file\n"; return -1; } std::fstream fso("output.txt",std::ios::out); if(fso.fail()) { std::cerr<< "Can't Create file\n"; return -1; } TbbPipelineProcess(fs,fso); //パイプライン処理へ return EXIT_SUCCESS; } //-------------Tbbの処理------------------------// void TbbPipelineProcess(std::fstream &fs,std::fstream &fso) { tbb::task_scheduler_init TbbInit; tbb::pipeline TbbPipeline; //パイプライン作成 //パイプライン(入力部分) InputFilter input_filter( fs ); TbbPipeline.add_filter( input_filter ); //パイプラインに登録 //パイプライン(出力部分) OutputFilter output_filter( fso ); TbbPipeline.add_filter( output_filter );//パイプラインに登録 //トークン数Max_tokenで実行 TbbPipeline.run(Max_token); TbbPipeline.clear(); TbbInit.terminate(); }