tf::Subflow class

class to construct a subflow graph from the execution of a dynamic task

tf::Subflow is spawned from the execution of a task to dynamically manage a child graph that may depend on runtime variables. You can explicitly join or detach a subflow by calling tf::Subflow::join or tf::Subflow::detach, respectively. By default, the Taskflow runtime will implicitly join a subflow it is is joinable.

The following example creates a taskflow graph that spawns a subflow from the execution of task B, and the subflow contains three tasks, B1, B2, and B3, where B3 runs after B1 and B2.

// create three static tasks
tf::Task A = taskflow.emplace([](){}).name("A");
tf::Task C = taskflow.emplace([](){}).name("C");
tf::Task D = taskflow.emplace([](){}).name("D");

// create a subflow graph (dynamic tasking)
tf::Task B = taskflow.emplace([] (tf::Subflow& subflow) {
  tf::Task B1 = subflow.emplace([](){}).name("B1");
  tf::Task B2 = subflow.emplace([](){}).name("B2");
  tf::Task B3 = subflow.emplace([](){}).name("B3");
  B1.precede(B3);
  B2.precede(B3);
}).name("B");

A.precede(B);  // B runs after A
A.precede(C);  // C runs after A
B.precede(D);  // D runs after B
C.precede(D);  // D runs after C

Base classes

class FlowBuilder
class to build a task dependency graph

Public functions

void join()
enables the subflow to join its parent task
void detach()
enables the subflow to detach from its parent task
auto joinable() const -> bool noexcept
queries if the subflow is joinable
auto executor() -> Executor& noexcept
acquires the associated executor
auto graph() -> Graph&
acquires the associated graph

Function documentation

void tf::Subflow::join()

enables the subflow to join its parent task

Performs an immediate action to join the subflow. Once the subflow is joined, it is considered finished and you may not modify the subflow anymore.

taskflow.emplace([](tf::Subflow& sf){
  sf.emplace([](){});
  sf.join();  // join the subflow of one task
});

Only the worker that spawns this subflow can join it.

void tf::Subflow::detach()

enables the subflow to detach from its parent task

Performs an immediate action to detach the subflow. Once the subflow is detached, it is considered finished and you may not modify the subflow anymore.

taskflow.emplace([](tf::Subflow& sf){
  sf.emplace([](){});
  sf.detach();
});

Only the worker that spawns this subflow can detach it.

bool tf::Subflow::joinable() const noexcept

queries if the subflow is joinable

This member function queries if the subflow is joinable. When a subflow is joined or detached, it becomes not joinable.

taskflow.emplace([](tf::Subflow& sf){
  sf.emplace([](){});
  std::cout << sf.joinable() << '\n';  // true
  sf.join();
  std::cout << sf.joinable() << '\n';  // false
});