Как отменить сопрограмму, созданную при помощи boost :: asio :: spawn - PullRequest
0 голосов
/ 08 ноября 2018

Я использую 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() и socket.close() вместе, но, поскольку сопрограмма усложняется, я должен отслеживать все, что может вызвать выход в сопрограмме, что утомительно и подвержено ошибкам. Есть ли способ безоговорочно остановить сопрограмму, созданную boost::asio::spawn, как у asyncio.task.cancel()?

в python
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...