C++ TBB流图条件执行
可以动态控制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
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节点
情况,使其不会产生