Task Enqueuing Flow Graph

The implementation of the flow graph that enqueues its tasks has been deprecated. There are limitations on the nesting of calls to wait_for_all on enqueued tasks. These limitations restrict the composability of flow graphs, preventing their use in some interesting cases. We therefore modified the flow graph to spawn tasks instead. See the Scheduling Algorithm section for a discussion of the differences between enqueued and spawned tasks.

To use the deprecated implementation that enqueues tasks, the preprocessor symbol TBB_DEPRECATED_FLOW_ENQUEUE must be non-zero.

If an application relies on the fire-and-forget nature of enqueued tasks, it may still be possible to avoid using the deprecated implementation. This might be done, for example, by enqueueing a task that in turn constructs and executes a spawning flow graph. The outer enqueued task will be serviced even if there are no worker threads available, and any thread created to service it will then also be availble to execute tasks spawned by its flow graph.

For more complete information about compiler optimizations, see our Optimization Notice.