#### Co-ordinating Parallel Operations

| Note
This is an experimental feature.

The `experimental::make_parallel_group` function may be used to launch work that is performed in parallel, and wait for one or all of the operations to complete. A `parallel_group` implements automatic cancellation of incomplete operations. For example:

    experimental::make_parallel_group(
        [&](auto token)
        {
          return stream.async_read_some(asio::buffer(data), token);
        },
        [&](auto token)
        {
          return timer.async_wait(token);
        }
      ).async_wait(
        experimental::wait_for_one(),
        [](
            std::array<std::size_t, 2> completion_order,
            asio::error_code ec1, std::size_t n1,
            asio::error_code ec2
        )
        {
          // ...
        }
      );

The conditions for completion of the group may be specified using one of the four provided function objects `wait_for_all`, `wait_for_one`, `wait_for_one_success`, `wait_for_one_error`, or with a custom function.

The `parallel_group` facility can also be combined with `deferred` as follows:

    experimental::make_parallel_group(
        stream.async_read_some(asio::buffer(data), deferred),
        timer.async_wait(experimental::deferred)
      ).async_wait(
        // ...
      );

Note: for maximum flexibility, `parallel_group` does not propagate the executor automatically to the operations within the group.

###### See Also

experimental::make_parallel_group, experimental::parallel_group, Parallel Groups examples (C++11), Parallel Groups examples (C++14).