如何用oneTBB编写单输入、可逐个输出vector元素的数据流节点?
解决方案
你可以用oneTBB的multifunction_node实现这个需求,别被它的名字误导——它不止用来输出tuple,核心是支持在处理过程中多次向输出端口发送数据,再配合串行执行策略,就能保证处理完一个输入的所有元素后再接收下一个输入。
具体实现要点:
- 定义
multifunction_node,输入类型设为你的输入值类型(示例用int),输出端口只保留一个,类型为int。 - 将节点执行策略设置为
serial,强制节点串行处理每个输入,确保前一个输入的所有元素发送完毕后,才会处理下一个输入。 - 在节点处理函数中,先根据输入生成目标
std::vector<int>,再遍历vector,对每个元素调用输出端口的send()方法,逐个发送给后续节点。
代码示例
#include <tbb/flow_graph.h> #include <vector> #include <iostream> using namespace tbb::flow; int main() { graph g; // 拆分节点:接收输入值,生成vector后逐个输出元素 multifunction_node<int, tuple<int>> split_node( g, serial, // 串行执行,保证输入任务按顺序处理 [](const int& input, sender<int>& output) { // 根据输入生成目标vector(示例:生成1到input的整数序列) std::vector<int> vec; for (int i = 1; i <= input; ++i) { vec.push_back(i); } // 逐个发送vector中的元素 for (int num : vec) { output.send(num); } } ); // 后续处理节点:接收单个int元素并处理(示例为打印) function_node<int> process_node( g, unlimited, [](int num) { std::cout << "Processing element: " << num << std::endl; } ); // 连接拆分节点与处理节点 make_edge(split_node, process_node); // 提交输入任务 split_node.try_put(3); split_node.try_put(2); // 等待整个数据流图执行完成 g.wait_for_all(); return 0; }
关键说明
serial执行策略:彻底避免多个输入的元素交叉发送,严格保证前一个输入的所有元素处理完毕后,才会启动下一个输入的处理流程。multifunction_node的send()方法:允许在一次处理函数调用中多次发送数据,完美适配“拆分vector为单个元素输出”的场景。
内容的提问来源于stack exchange,提问作者Mike Xyleu
相关产品推荐
相关产品推荐

