In part 1 and part 2 we have explored some techniques that allow us to build simple future
-like computation chains without type-erasure or allocations. While our examples demonstrated the idea of nesting computations by moving *this
into a parent node (resulting in “huge types”), they did not implement any operation that could be executed in parallel.
Our goal is to have a new when_all
node type at the end of this article, which takes an arbitrary amount of Callable
objects, invokes them in parallel, aggregates the results, and invokes an eventual continuation afterwards. We’ll do this in a non-blocking manner: the thread that completes the last Callable
will continue executing the rest of the computation chain without blocking or context-switching.