oneTBB icon indicating copy to clipboard operation
oneTBB copied to clipboard

[FR] Move semantics for flow graph

Open sdebionne opened this issue 4 years ago • 5 comments

When running a graph outside the main thread, it's very tempting to create the graph/nodes in the main thread and then move them to the execution thread. Unfortunately that does not work out of the box as graph (and probably some implementation detail such as spin_mutex) it not movable (and neither copiable).

Ideally I would like to write something like:

{
    // Create the graph, nodes and edges
    input_node_t input(g, tbb::flow::unlimited);
    function_node_t function(g, tbb::flow::unlimited);

    tbb::flow::make_edge(input, function);

    std::cout << "Graph prepared";

    // Run a TBB flow graph asynchronously (using std::async for simplicity)
    auto fut = std::async(std::launch::async,
                          [g_ = std::move(g), input_ = std::move(input), function_ = std::move(function)]() mutable {
                              input_.activate();
                              g_.wait_for_all();

                              std::cout << "Graph finished" << std::endl;
                          });

    // Here the graph, nodes and edges go out of scope
}

A workaround is to wrap the graph with unique_ptr but it's not user friendly.

sdebionne avatar Jul 30 '21 08:07 sdebionne

Looking at the code and since the nodes keep a reference to the graph, this FR seems hardly possible.

sdebionne avatar Jul 30 '21 08:07 sdebionne

As a straightforward workaround, have you tried to wrap graph into std::unique_ptr?

alex-katranov avatar Jul 30 '21 18:07 alex-katranov

Thanks, that's what I end up doing, like I mention in the original comment. As a side question, what is the rational of having nodes keep a reference to a graph that can get dangling vs having the graph own the nodes (and for instance allow to visit them to get the node topology)?

sdebionne avatar Sep 15 '21 10:09 sdebionne

I believe when flow graph was designed and introduced (in ~2010) nobody seriously thought about move semantics support that was introduced in C+11. Perhaps, it can be redesigned in such aspect but the cost of the effort and broken backward compatibility should be considered.

alex-katranov avatar Sep 27 '21 13:09 alex-katranov