【问题标题】:Minimal awaitable example最小的等待示例
【发布时间】:2021-08-19 10:43:35
【问题描述】:

我想知道为什么下面的程序会崩溃。如何使用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;
}

【问题讨论】:

  • 这里没有使用 C++20 协程。
  • 在您的调试器中,崩溃发生在哪里?
  • @alterigel 在awaitable.hpp 内的push_frame 函数内,在它尝试caller_ = caller 的第一行。
  • 找到解决方案:只需使用 c++20 关键字 'co_return' 而不是 'return awaitable{}';
  • @dronte7 编译的事实并不能使它正确。例如,出于我指出的原因,您的示例代码与example here 形成直接对比。话虽如此,这只是试图可能有所帮助。无需居高临下的答复。

标签: c++ boost-asio c++-coroutine boost-coroutine


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-10
    • 2018-01-05
    • 2016-05-20
    • 1970-01-01
    • 2021-09-18
    相关资源
    最近更新 更多