【发布时间】: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