Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ TBB流图条件执行_C++_Multithreading_Asynchronous_Tbb_Tbb Flow Graph - Fatal编程技术网

C++ TBB流图条件执行

C++ TBB流图条件执行,c++,multithreading,asynchronous,tbb,tbb-flow-graph,C++,Multithreading,Asynchronous,Tbb,Tbb Flow Graph,可以动态控制TBB流图中的执行路径,使用节点的输出作为条件变量来确定是否应启动另一个节点?有几种方法可以动态控制消息在流::图中的位置: 您可以显式地将消息放置到节点主体中的其他节点。请注意,func_body根据其输入值将消息放入f1或f2。节点不是通过make_edge()连接的,因为消息流不受图形拓扑的控制: template<typename T> struct func_body { typedef tbb::flow::function_node<T,T&g

可以动态控制TBB流图中的执行路径,使用节点的输出作为条件变量来确定是否应启动另一个节点?

有几种方法可以动态控制消息在流::图中的位置:

您可以显式地将消息放置到节点主体中的其他节点。请注意,
func_body
根据其输入值将消息放入
f1
f2
。节点不是通过
make_edge()
连接的,因为消息流不受图形拓扑的控制:

template<typename T>
struct func_body {
    typedef tbb::flow::function_node<T,T> target_node_type;
    target_node_type &my_n1;
    target_node_type &my_n2;
    func_body(target_node_type &node1, target_node_type &node2) : my_n1(node1), my_n2(node2) {}
    tbb::flow::continue_msg operator()(const T& in) {
        // do some computation
        bool send_to_one = in > 0;
        if(send_to_one) my_n1.try_put(in);
        else            my_n2.try_put(in);
        return tbb::flow::continue_msg();  // message is discarded if no successor exists
    }
};

struct otherbody {
    int operator()(const int& in) {
        return in;
    }
};

int
main() {
    tbb::flow::graph g;
    tbb::flow::function_node<int,int> f1(g, tbb::flow::unlimited, otherbody());
    tbb::flow::function_node<int,int> f2(g, tbb::flow::unlimited, otherbody());
    tbb::flow::function_node<int> cn(g, tbb::flow::unlimited, func_body<int>(f1,f2));
}

目前这两种方法在功能上是相同的;每个节点都将生成一个任务来执行
函数\u节点的主体。将来,如果只有一个输出端口是
try\u put()
to,则可以优化
多功能\u节点
情况,使其不会生成。

有两种方法可以动态控制消息在flow::graph中的位置:

您可以显式地将消息放置到节点主体中的其他节点。请注意,
func_body
根据其输入值将消息放入
f1
f2
。节点不是通过
make_edge()
连接的,因为消息流不受图形拓扑的控制:

template<typename T>
struct func_body {
    typedef tbb::flow::function_node<T,T> target_node_type;
    target_node_type &my_n1;
    target_node_type &my_n2;
    func_body(target_node_type &node1, target_node_type &node2) : my_n1(node1), my_n2(node2) {}
    tbb::flow::continue_msg operator()(const T& in) {
        // do some computation
        bool send_to_one = in > 0;
        if(send_to_one) my_n1.try_put(in);
        else            my_n2.try_put(in);
        return tbb::flow::continue_msg();  // message is discarded if no successor exists
    }
};

struct otherbody {
    int operator()(const int& in) {
        return in;
    }
};

int
main() {
    tbb::flow::graph g;
    tbb::flow::function_node<int,int> f1(g, tbb::flow::unlimited, otherbody());
    tbb::flow::function_node<int,int> f2(g, tbb::flow::unlimited, otherbody());
    tbb::flow::function_node<int> cn(g, tbb::flow::unlimited, func_body<int>(f1,f2));
}
目前这两种方法在功能上是相同的;每个节点都将生成一个任务来执行
函数\u节点的主体。将来,如果只有一个输出端口是
try\u put()
to,则可以优化
多功能\u节点
情况,使其不会产生