第七课: pipeline pattern
tbb中的pipeline模式是通过pipeline和filter两个类来完成,其中pipeline负责控制,各个stage通过实现filter的operator()函数完成自己的工作。 tbb中pipeline的定义如下:
class pipeline {
public:
void add_filter(filter& filter_);
void run(size_t max_live_tokens);
void clear();
private:
filter *filter_list;
empty_task *end_counter;
atomic<internal::Token> input_tokens;
};
class filter {
public:
filter(bool is_serial_);
filter(mode filter_mode);
virtual void * operator() (void *item) = 0;
private:
filter *next_filter_in_pipeline;
filter *prev_filter_in_pipeline;
internal::ordered_buffer *input_buffer;
const unsigned char my_filter_mode;
pipeline *my_pipeline;
}
|
从定义可以看出,通过pipeline::add_filter来将filter组合成pipeline,然后pipeline::run()将启动pipeline。对pipeline中的filter有两种模式,serial和parallel,serial模式下这个stage将只有一个thread,否则会创建多个thread,如果pipeline所有stage都是serial,整个pipeline就是serial,pipeline::run()将直接一次调用每个filter的operator(),完全不用创建新的thread。在parallel模式下,并行程度很大由run(max_live_tokens)参数决定,max_live_tokens决定了一个stage最多有可能几个operator()在并行。另外整个pipeline的throughput也是由处理最慢的那个stage决定的,最慢的stage决定了这个pipeline在每分钟所能处理的item的数目。
另外注意,每个stage的operator()的参数是不同的,是其上一个stage的operator()输出的结果。
阅读(1041) | 评论(0) | 转发(0) |