c++ - 线程构建 block 流程图——创建一个 "counting"节点

标签 c++ multithreading tbb

在传递一条消息之前,我需要累积 2 条传入消息。 continue_node 的文档提到阈值参数 T 但不清楚它是否总是等于连接的前辈数。就我而言,只有一个前任,但我希望 T = 2。这可能吗?

continue_node<continue_msg> count2(g, 1, MessageForwarder());
make_edge(some_message_generator, count2);
T==2; // hopefully true?

其中 MessageForwarder 是一个简单的消息转发器主体(除非有预定义的?),

class MessageForwarder {
    continue_msg operator()(continue_msg /*m*/) {
        return continue_msg();
    }
};

我很高兴听到任何关于这个或其他制作简单“计数节点”的方法的建议。

最佳答案

正如您推测的那样,continue_node 在收到与前导数相等的 continue_msgs 之前不会触发主体。如果您在构造函数中指定前导计数,则该计数将初始化为该数字,并向节点添加一条边以增加该计数。

我包括一个小程序来演示这一点:

#include "tbb/flow_graph.h"
#include <iostream>

using namespace tbb::flow;

struct continue_body {
    continue_msg operator()(const continue_msg& /*c*/) {
        return continue_msg();
    }
};

struct output_body {
    int my_count;
    output_body() { my_count = 0; }
    continue_msg operator()(const continue_msg&) {
        std::cout << "Received continue_msg " << ++my_count << "\n";
    }
};

int
main() {
    graph g;
    continue_node<continue_msg> counting_node(g, continue_body());
    continue_node<continue_msg> counting_node2(g, 1, continue_body());
    function_node<continue_msg> output_node(g, serial, output_body());

    make_edge(counting_node, counting_node2);
    make_edge(counting_node2, output_node);
    for(int i = 0; i < 10; ++i) {
        counting_node.try_put(continue_msg());
    }
    g.wait_for_all();
}

我将 continue_node counting_node2 初始化为 1,并为其添加了一条边。输出应该是

Received continue_msg 1
Received continue_msg 2
Received continue_msg 3
Received continue_msg 4
Received continue_msg 5

可以看看an answer on the TBB forum site使用 mutlifunction_nodes 的另一种方法。

关于c++ - 线程构建 block 流程图——创建一个 "counting"节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17781282/

相关文章:

c++ - Intel TBB 在并行线程中运行函数?

c++ - 作为类成员的 2D vector 指针

C++:简单的任务,多次调用析构函数

c++ - 有和没有骨架的网格应该使用不同的着色器吗?

java - 两个线程调用静态函数 - 同步问题?

java - Apache + Tomcat部署中Tomcat线程池的行为

c++ - tbb::concurrent_unordered_multimap 中的错误?即使是单线程,条目也会丢失

c++ - 创建重复声明

Swift COW 线程安全

linux - 采购 `compilervars.sh intel64` 时 libtbb.so.2 库不存在