要解决此特定问题英特尔®线程构建模块库包含特殊结构。 Intel® TBB是跨平台的库,它有助于多线程编程。 我们可以在四个不同的任务提供者处查看应用程序中涉及的实体。一种类型的任务是输入任务 - 那些提供输入数据的任务,另一种类型的任务由第一个操作例程提供,等等。
因此,用户需要做的唯一事情就是为这些任务提供正文。库中有几个API用于指定要处理的物体以及如何并行处理。其他一切(这里我指的是线程创建,任务执行之间的同步,工作平衡等)由库完成。
我想到的最简单的解决方案是使用parallel_pipeline函数。这里是原型:
#include "tbb/pipeline.h"
using namespace tbb;
int main() {
parallel_pipeline(/*specify max number of bodies executed in parallel, e.g.*/16,
make_filter<void, input_data_type>(
filter::serial_in_order, // read data sequentially
[](flow_control& fc) -> input_data_type {
if (/*check some stop condition: EOF, etc.*/) {
fc.stop();
return input_data_type(); // return dummy value
}
auto input_data = read_data();
return input_data;
}
) &
make_filter<input_data_type, manipulator1_output_type>(
filter::parallel, // process data in parallel by the first manipulator
[](input_data_type elem) -> manipulator1_output_type {
auto processed_elem = manipulator1::process(elem);
return processed_elem;
}
) &
make_filter<manipulator1_output_type, manipulator2_output_type>(
filter::parallel, // process data in parallel by the second manipulator
[](manipulator1_output_type elem) -> manipulator2_output_type {
auto processed_elem = manipulator2::process(elem);
return processed_elem;
}
) &
make_filter<manipulator2_output_type, void>(
filter::serial_in_order, // visualize frame by frame
[](manipulator2_output_type elem) {
visualize(elem);
}
)
);
return 0;
}
前提是必需的功能(的read_data,可视化)被实现。这里input_data_type
,manipulator1_output_type
等是在流水线阶段之间传递的类型,并且操纵器的process
函数对传递的参数进行必要的计算。
顺便说一句,为避免使用锁和其他同步原语工作,可以使用库中的concurrent_bounded_queue,并将输入数据放入此队列中,可能由不同的线程(例如专用于IO操作)组成,如concurrent_bounded_queue_instance.push(elem)
,以及然后通过input_data_type elem; concurrent_bounded_queue_instance.pop(elem)
阅读。请注意,在这里弹出一个项目是一个阻塞操作。 concurrent_queue
提供了非阻塞try_pop
的替代方案。
另一种可能性是使用tbb::flow_graph
及其节点来组织相同的流水线方案。看看描述dependency和data流程图的两个示例。您可能需要使用sequencer_node来正确排序项目执行(如有必要)。
这是值得阅读标记tbb标记SO看看其他人如何使用这个库。
什么是“缓冲块”的含义实验?函数调用块,而不是数据结构。 –
@KerrekSB:你说得对。我的意思是读取电话会阻塞,直到有缓冲区中的数据 – marcman
我想你应该看看[消费者/制造商问题](https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem ) – cbuchart