You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:05:36