最小等待示例

Minimal awaitable example

我想知道为什么下面的程序会崩溃。如何使用 awaitable 而不是 boost::asio::async_write/async_read 函数。

让我们看看:

#include <iostream>

#include <boost/asio/io_context.hpp>
#include <boost/asio/co_spawn.hpp>
#include <boost/asio/detached.hpp>

using boost::asio::io_context;
using boost::asio::co_spawn;
using boost::asio::awaitable;
using boost::asio::detached;

awaitable<void> task() {
  std::cout << "hello" << std::endl;
  return awaitable<void>{};
}

int main() {
  try {
    boost::asio::io_context io_context(1);

    co_spawn(io_context, task(), detached);

    io_context.run();
  } catch(const std::exception &ex) {
    std::cerr << ex.what() << std::endl;
  }
  return 0;
}

这导致

hello
(Segmentation fault)

有什么问题吗?

UPD:自行解决。 我应该只使用 co_return。因此它必须是以下内容:

awaitable<void> task() {
  std::cout << "hello" << std::endl;
  co_return;
}

深入研究 boost::asio::awaitable 的来源,我发现我应该使用 co_return 关键字。令人惊讶的是,它 boost 一起提供。它由 -fcoroutines 标志或 -std=c++20 启用。不料。说了这么多,就解决了