我是英特尔TBB库的新手.如您所见,我的问题与tbb :: flow :: graph有关.我需要实现如下逻辑:
用户使用一些逻辑块绘制图形.每个块(节点)可以具有无限的连接(边缘),因此每个块(节点)可以选择接下来放置数据的位置.然后我的程序将在TBB库的帮助下构建这样的图形并执行计算.
所以我不知道是否有可能构造具有动态输出端口数的节点(我想它必须是multifunction_node).你能告诉我这样做的方法吗?
我目前正在测试 tbb 的流程图功能。为了使用它,我必须能够中止图中某个节点的执行,包括所有依赖它的子节点,但让其他不依赖它的子节点执行。从主体抛出异常或调用 task::cancel_group_execution() 会中止所有节点的执行。
#include <cstdio>
#include "tbb/flow_graph.h"
using namespace tbb::flow;
struct body
{ std::string my_name;
body( const char *name ) : my_name(name)
{
}
void operator()( continue_msg ) const
{ if (my_name == "B")
tbb::task::self().group()->cancel_group_execution();
else
{ sleep(1);
printf("%s\n", my_name.c_str());
}
}
};
int main()
{
graph g;
broadcast_node< continue_msg > start(g);
continue_node<continue_msg> a( g, body("A"));
continue_node<continue_msg> b( g, body("B"));
continue_node<continue_msg> c( g, body("C"));
continue_node<continue_msg> d( g, body("D"));
continue_node<continue_msg> e( g, body("E"));
make_edge( start, a );
make_edge( start, …Run Code Online (Sandbox Code Playgroud) 我需要在 tbb::flow::graph(英特尔 TBB 库)中的节点之间发送一些“重”类型,即其中包含动态数组的结构。如果我尝试在一个节点中创建此类结构的实例并将其上的指针发送到另一个节点,则会出现访问冲突(这是意料之中的,因为我尝试使用来自另一个线程的数据)。
因此,传递此类参数的唯一方法是使用适当的复制构造函数按值传递它们,不是吗?但是那样我们会浪费很多时间来复制......
更新:??????建议使用 std::unique_ptr 通过节点传递此类类型。但恐怕我不明白如何实现它。例如,如何将 std::unique_ptr 与 source_node 一起使用?
更新 2:使用 std::unique_ptr<> 在 flow_graph.h 第 287 行中给出 C2280 '试图引用已删除的函数'。
所以问题仍然存在。
我构建了一个tbb::flow::graph由几个function_node对象组成的对象。在执行期间,我将多条消息传递到图中(从 ~10 到 ~100000)。有时其中一个节点会抛出异常。如果是这种情况,整个图的执行将被取消,这意味着所有消息都将被丢弃。但是,我的消息是相互独立的,我不希望它们的执行被停止。
我可以直接在节点内部捕获异常,但是当发生这种情况时,对消息的进一步处理将没有意义。
所以我的问题是:如何从图中取消或删除单个消息而不取消图中已经存在的其他消息的执行?
可以动态地控制TBB流图中的执行路径,使用节点的输出作为条件变量来确定是否应该启动另一个节点?