此代码调用已发布的句柄
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
以某种方式更改此行为?
对此进行了记录(不在最佳位置,应在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
这里有一个额外的线索为什么。