c++ - 如何取消由 boost::asio::spawn 创建的协程
问题描述
我boost::asio::spawn
用来启动协程
boost::asio::io_context ioc;
boost::asio::steady_timer timer(ioc);
boost::asio::ip::tcp::socket socket(ioc);
boost::asio::io_context::strand strand(ioc);
......
boost::asio::spawn(strand, [&](boost::asio::yield_context yield)
{
while(true){
http::async_write(socket, req_indicators, yield);
http::async_read(socket, buffer, res, yield);
// do something with res
timer.expires_after(interval);
timer.async_wait(yield);
}
}
......
现在我想立即取消这个协程(不等待计时器到期并检查标志)而不停止整个ioc
,因为有其他协程在同一链中运行。
我可以一起调用timer.cancel()
and socket.close()
,但是随着协程变得复杂,我必须跟踪所有可能导致协程中的 yield 的事情,这很烦人并且容易出错。有没有一种方法可以无条件地停止由创建的协程boost::asio::spawn
,比如 python 的asyncio.task.cancel()
?
解决方案
推荐阅读
- forms - 用于收集数据和上传文件的 WebApp Google 脚本
- bots - ms 团队 bot 命令菜单替代移动客户端
- ios - 当视图嵌入在按钮中时,SwiftUI 匹配几何效果“匹配几何组中的多个插入视图对警告”
- java - 为什么JPA OneToOne(甚至OneToMany)的orphanRemoval默认为false
- python - 迭代节点列表时如何返回布尔值?
- javascript - 尽管文本中有数字,但解析 Int 返回 NaN
- python - 按钮仅绘制图像一秒钟
- ios - iOS swift得到问题firebase崩溃分析库安装
- php - 如何使用phpexcel在excel中将列设置为字符串。?
- python - 如何修复“ValueError:int()的无效文字,基数为10:''发生。无论何时需要pyobjc,包括安装pyobjc