提问者:小点点

防止Boost::ASIO::IO_Context在空轮询调用时停止


此代码调用已发布的句柄

    boost::asio::io_context ioc;
    boost::asio::post(ioc, []{ std::cout << "lol" << std::endl; });
    ioc.poll();

而这并不是:

    boost::asio::io_context ioc;
    ioc.poll(); // empty, set internal state to stopped_
    boost::asio::post(ioc, []{ std::cout << "lol" << std::endl; });
    ioc.poll(); // doesn't work as stopped() now returns true

活生生的例子

是故意的吗? 如果是,为什么? 是否可以配置IO_context以某种方式更改此行为?


共1个答案

匿名用户

对此进行了记录(不在最佳位置,应在poll文档中提及):

IO_Context::Restart-Developer

重新启动IO_context,为后续的run()调用做准备。

作废重新启动();

当由于IO_Context停止或停止工作而返回前一次调用Run()Run_One()Poll()Poll_One()函数时,必须在调用这些函数之前调用此函数。 调用restart()后,IO_context对象的stopped()函数将返回false

当对run()run_one()poll()poll_one()函数有任何未完成的调用时,不得调用此函数。

所以基本上您需要添加restart来使其工作。

https://wandbox.org/permlink/AXZZ5GCAIMIVSTNL

这里有一个额外的线索为什么。