最小等待示例
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
启用。不料。说了这么多,就解决了
我想知道为什么下面的程序会崩溃。如何使用 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
启用。不料。说了这么多,就解决了