作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用协程玩 asio,并想测试如何调用异步函数。我有以下代码:
void async_foo(boost::asio::io_service& io_service, boost::asio::yield_context& yield)
{
using handler_type = boost::asio::handler_type<decltype(yield), void()>::type;
handler_type handler(std::forward<handler_type>(yield));
boost::asio::async_result<decltype(handler)> result(handler);
auto timer(std::make_shared<boost::asio::deadline_timer>(io_service, boost::posix_time::seconds(1)));
// the program crashes if I use &handler here
timer->async_wait([&handler](const boost::system::error_code) {
std::cout << "enter" << std::endl;
handler();
std::cout << "done" << std::endl;
});
result.get();
std::cout << "function finished" << std::endl;
return;
}
int main()
{
boost::asio::io_service io_service;
boost::asio::spawn(io_service, [&io_service](boost::asio::yield_context yield) {
std::cout << "hello" << std::endl;
async_foo(io_service, yield);
std::cout << "world" << std::endl;
});
io_service.run();
return 0;
}
最佳答案
正如 Tanner 很好地解释 here :
- While
spawn()
adds work to theio_service
(a handler that will start and jump to the coroutine), the coroutine itself is not work. To prevent theio_service
event loop from ending while a coroutine is outstanding, it may be necessary to add work to theio_service
before yielding.
run()
之后添加额外的跟踪行:
io_service.run();
std::cout << "BYE" << std::endl;
hello
enter
done
BYE
timer
未在
async_wait
的完成处理程序中捕获,计时器被简单地取消,但仍然尝试调用现在引用现已失效的堆栈变量
handler
的完成处理程序.
handler
显然²确实让 coro 活着。
void async_foo(boost::asio::io_service& io_service, boost::asio::yield_context& yield)
{
boost::asio::deadline_timer timer(io_service, boost::posix_time::seconds(1));
boost::system::error_code ec;
timer.async_wait(yield[ec]);
-fsanitize=address
证实了这一点
weak_ptr
到协程上下文,所以也许 Asio 在内部将其锁定到
shared_ptr
,我自己也不太清楚那些实现细节
关于c++ - 想知道为什么我不能只为协程捕获 asio::handler_type 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43403896/
我正在使用协程玩 asio,并想测试如何调用异步函数。我有以下代码: void async_foo(boost::asio::io_service& io_service, boost::asio::
我发现了这个有趣的链接 boost::asio::spawn yield as callback 由于这可能正是我所需要的,因此我想尝试以下部分: template auto async_foo(u
我是一名优秀的程序员,十分优秀!