生成一个新的基于协程的执行线程。
template< typename ExecutionContext, typename F, typename CompletionToken = DEFAULT> DEDUCED co_spawn( ExecutionContext & ctx, F && f, CompletionToken && token = DEFAULT, constraint_t< is_convertible< ExecutionContext &, execution_context & >::value > = 0);
一个执行上下文,它将提供执行器来调度新的执行线程。
一个无参函数对象,其返回类型为 boost::asio::awaitable<R,E>
,将用作协程的入口点。
完成令牌,它将处理执行线程已完成的通知。如果 R
是 void
,则完成处理程序的功能签名必须是
void handler(std::exception_ptr);
否则,完成处理程序的功能签名必须是
void handler(std::exception_ptr, R);
void(std::exception_ptr, R)
其中 R
是提供的函数对象 F:
返回的 awaitable
的第一个模板参数:
boost::asio::awaitable<R, AwaitableExecutor> F()
boost::asio::awaitable<std::size_t> echo(tcp::socket socket) { std::size_t bytes_transferred = 0; try { char data[1024]; for (;;) { std::size_t n = co_await socket.async_read_some( boost::asio::buffer(data), boost::asio::use_awaitable); co_await boost::asio::async_write(socket, boost::asio::buffer(data, n), boost::asio::use_awaitable); bytes_transferred += n; } } catch (const std::exception&) { } co_return bytes_transferred; } // ... boost::asio::co_spawn(my_io_context, [socket = std::move(my_tcp_socket)]() mutable -> boost::asio::awaitable<void> { try { char data[1024]; for (;;) { std::size_t n = co_await socket.async_read_some( boost::asio::buffer(data), boost::asio::use_awaitable); co_await boost::asio::async_write(socket, boost::asio::buffer(data, n), boost::asio::use_awaitable); } } catch (const std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } }, boost::asio::detached);
新的执行线程创建时具有取消状态,该状态仅支持 cancellation_type::terminal
值。要更改取消状态,请调用 this_coro::reset_cancellation_state
。