Boost C++ 库

...世界上最受推崇和专业设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

PrevUpHomeNext

co_spawn (6 个重载中的第 6 个)

生成一个新的基于协程的执行线程。

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);
参数

ctx

一个执行上下文,它将提供执行器来调度新的执行线程。

f

一个无参函数对象,其返回类型为 boost::asio::awaitable<R,E>,将用作协程的入口点。

token

完成令牌,它将处理执行线程已完成的通知。如果 Rvoid,则完成处理程序的功能签名必须是

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


PrevUpHomeNext