### spawn

Start a new stackful coroutine.

Start a new stackful coroutine that executes on a given executor.

    template<
        typename Executor,
        typename F,
        typename CompletionToken = default_completion_token_t<Executor>>
    auto spawn(
        const Executor & ex,
        F && function,
        CompletionToken && token = default_completion_token_t< Executor >(),
        constraint_t< is_executor< Executor >::value||execution::is_executor< Executor >::value >  = 0);
      » more...

Start a new stackful coroutine that executes on a given execution context.

    template<
        typename ExecutionContext,
        typename F,
        typename CompletionToken = default_completion_token_t<            typename ExecutionContext::executor_type>>
    auto spawn(
        ExecutionContext & ctx,
        F && function,
        CompletionToken && token = default_completion_token_t< typename ExecutionContext::executor_type >(),
        constraint_t< is_convertible< ExecutionContext &, execution_context & >::value >  = 0);
      » more...

Start a new stackful coroutine, inheriting the executor of another.

    template<
        typename Executor,
        typename F,
        typename CompletionToken = default_completion_token_t<Executor>>
    auto spawn(
        const basic_yield_context< Executor > & ctx,
        F && function,
        CompletionToken && token = default_completion_token_t< Executor >(),
        constraint_t< is_executor< Executor >::value||execution::is_executor< Executor >::value >  = 0);
      » more...

Start a new stackful coroutine that executes on a given executor.

    template<
        typename Executor,
        typename StackAllocator,
        typename F,
        typename CompletionToken = default_completion_token_t<Executor>>
    auto spawn(
        const Executor & ex,
        allocator_arg_t ,
        StackAllocator && stack_allocator,
        F && function,
        CompletionToken && token = default_completion_token_t< Executor >(),
        constraint_t< is_executor< Executor >::value||execution::is_executor< Executor >::value >  = 0);
      » more...

Start a new stackful coroutine that executes on a given execution context.

    template<
        typename ExecutionContext,
        typename StackAllocator,
        typename F,
        typename CompletionToken = default_completion_token_t<            typename ExecutionContext::executor_type>>
    auto spawn(
        ExecutionContext & ctx,
        allocator_arg_t ,
        StackAllocator && stack_allocator,
        F && function,
        CompletionToken && token = default_completion_token_t< typename ExecutionContext::executor_type >(),
        constraint_t< is_convertible< ExecutionContext &, execution_context & >::value >  = 0);
      » more...

Start a new stackful coroutine, inheriting the executor of another.

    template<
        typename Executor,
        typename StackAllocator,
        typename F,
        typename CompletionToken = default_completion_token_t<Executor>>
    auto spawn(
        const basic_yield_context< Executor > & ctx,
        allocator_arg_t ,
        StackAllocator && stack_allocator,
        F && function,
        CompletionToken && token = default_completion_token_t< Executor >(),
        constraint_t< is_executor< Executor >::value||execution::is_executor< Executor >::value >  = 0);
      » more...

(Deprecated: Use overloads with a completion token.) Start a new stackful coroutine, calling the specified handler when it completes.

    template<
        typename Function>
    void spawn(
        Function && function,
        const boost::coroutines::attributes & attributes = boost::coroutines::attributes());
      » more...

    template<
        typename Handler,
        typename Function>
    void spawn(
        Handler && handler,
        Function && function,
        const boost::coroutines::attributes & attributes = boost::coroutines::attributes(),
        constraint_t< !is_executor< decay_t< Handler > >::value &&!execution::is_executor< decay_t< Handler > >::value &&!is_convertible< Handler &, execution_context & >::value >  = 0);
      » more...

(Deprecated: Use overloads with a completion token.) Start a new stackful coroutine, inheriting the execution context of another.

    template<
        typename Executor,
        typename Function>
    void spawn(
        basic_yield_context< Executor > ctx,
        Function && function,
        const boost::coroutines::attributes & attributes = boost::coroutines::attributes());
      » more...

(Deprecated: Use overloads with a completion token.) Start a new stackful coroutine that executes on a given executor.

    template<
        typename Function,
        typename Executor>
    void spawn(
        const Executor & ex,
        Function && function,
        const boost::coroutines::attributes & attributes = boost::coroutines::attributes(),
        constraint_t< is_executor< Executor >::value||execution::is_executor< Executor >::value >  = 0);
      » more...

(Deprecated: Use overloads with a completion token.) Start a new stackful coroutine that executes on a given strand.

    template<
        typename Function,
        typename Executor>
    void spawn(
        const strand< Executor > & ex,
        Function && function,
        const boost::coroutines::attributes & attributes = boost::coroutines::attributes());
      » more...

(Deprecated: Use overloads with a completion token.) Start a new stackful coroutine that executes in the context of a strand.

    template<
        typename Function>
    void spawn(
        const asio::io_context::strand & s,
        Function && function,
        const boost::coroutines::attributes & attributes = boost::coroutines::attributes());
      » more...

(Deprecated: Use overloads with a completion token.) Start a new stackful coroutine that executes on a given execution context.

    template<
        typename Function,
        typename ExecutionContext>
    void spawn(
        ExecutionContext & ctx,
        Function && function,
        const boost::coroutines::attributes & attributes = boost::coroutines::attributes(),
        constraint_t< is_convertible< ExecutionContext &, execution_context & >::value >  = 0);
      » more...

The `spawn` function is a high-level wrapper over the Boost.Coroutine library. This function enables programs to implement asynchronous logic in a synchronous manner, as illustrated by the following example:

    asio::spawn(my_strand, do_echo, asio::detached);

    // ...

    void do_echo(asio::yield_context yield)
    {
      try
      {
        char data[128];
        for (;;)
        {
          std::size_t length =
            my_socket.async_read_some(
              asio::buffer(data), yield);

          asio::async_write(my_socket,
              asio::buffer(data, length), yield);
        }
      }
      catch (std::exception& e)
      {
        // ...
      }
    }

##### Requirements

Header: `asio/impl/spawn.hpp`

Convenience header: `asio.hpp`