현재 tbb의 플로우 그래프 기능을 테스트 중입니다. 그래프를 사용하려면 그래프에 의존하는 모든 자식을 포함하지만 실행에 의존하지 않는 다른 자식은 그대로두고 그래프의 일부 노드 실행을 중단 할 수 있어야합니다. 본문에서 예외를 throw하거나 task :: cancel_group_execution()을 호출하면 모든 노드의 실행이 중단됩니다. 당신이 그래프의 실행의 일부를 취소 할 수있게하려면tbb 플로우 그래프에서 노드와 그 자식의 실행을 중단하는 방법
#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, b);
make_edge(a, c);
make_edge(b, c);
make_edge(c, d);
make_edge(a, e);
for (int i = 0; i < 3; ++i)
try
{ start.try_put(continue_msg());
g.wait_for_all();
} catch (...)
{ printf("Caught exception\n");
}
return 0;
}
예제 코드에서 노드 A, E가 처리되고 노드 B, C, D는 건너 뛸 것으로 예상합니까? – yohjp
그렇습니다. 단, B는 실제로 건너 뛰지는 않았지만 실패했습니다. –