首页 > 解决方案 > 如何取消由 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()

标签: c++boost

解决方案


推荐阅读