Boost C++ 库

……在全世界范围内享有盛誉、设计精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, 《C++ 编码标准》

co_spawn (6 个重载中的第 1 个) - Boost C++ 函数库
PrevUpHomeNext

启动一个新的基于协程的执行线程。

template<
    typename Executor,
    typename T,
    typename AwaitableExecutor,
    typename CompletionToken = DEFAULT>
DEDUCED co_spawn(
    const Executor & ex,
    awaitable< T, AwaitableExecutor > a,
    CompletionToken && token = DEFAULT,
    constraint_t<(is_executor< Executor >::value||execution::is_executor< Executor >::value) &&is_convertible< Executor, AwaitableExecutor >::value >  = 0);
参数

ex

将用于调度新执行线程的执行器。

a

调用协程入口点函数的结果 awaitable 对象。

标记

将用于处理线程执行完成通知的 完成令牌。完成处理程序的函数签名必须为

void handler(std::exception_ptr, T);
完成签名
void(std::exception_ptr, T)
示例
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_executor,
  echo(std::move(my_tcp_socket)),
  [](std::exception_ptr e, std::size_t n)
  {
    std::cout << "transferred " << n << "\n";
  });
按操作取消

新执行线程的创建将支持 cancellation_type::terminal 类型值的取消状态。要更改取消状态,请调用 this_coro::reset_cancellation_state


PrevUpHomeNext