# tf::Subflow class
#include <taskflow/core/flow_builder.hpp>

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

tf::Subflow is a derived class from tf::Runtime with a specialized mechanism to manage the execution of a child graph. By default, a subflow automatically joins its parent node. You may explicitly join or detach a subflow by calling tf::Subflow::join or tf::Subflow::detach, respectively. 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
class Runtime
  class to include a runtime object in a task

## Public functions

void join()
  enables the subflow to join its parent task
void detach()
  enables the subflow to detach from its parent task
void reset(bool clear_graph = true)
  resets the subflow to a joinable state
auto joinable() const -> bool noexcept
  queries if the subflow is joinable

## 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.

### void tf::Subflow:: reset(bool clear_graph = true)

resets the subflow to a joinable state

Parameters
clear_graph | specifies whether to clear the associated graph (default `true`)

Clears the underlying task graph depending on the given variable `clear_graph` (default `true`) and then updates the subflow to a joinable state.

### 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
    });

Tab / T to search, Esc to close
…

Search for symbols, directories, files, pages or modules. You can omit any prefix from the symbol or file path; adding a `:` or `/` suffix lists all members of given symbol or directory.

Use ↓ / ↑ to navigate through the list, Enter to go. Tab autocompletes common prefix, you can copy a link to the result using ⌘ L while ⌘ M produces a Markdown link.

Sorry, nothing was found.