最近我和boost asio一起工作,有一个声明,我认为文档中的读者含糊不清
The poll() function runs handlers that are ready to run, without blocking, until the io_service has been stopped or there are no more ready handlers.
为了验证我的理解,下面进行实验
boost::asio::io_service io;
boost::system::error_code error;
boost::asio::signal_set signals(io);
signals.add(SIGINT);signals.add(SIGTERM);signals.add(SIGQUIT);
/* asynchronous wait on signal conditions to stop io service */
signals.async_wait([&io](const boost::system::error_code & code, int val){
io.stop();
});
/* the only main thread polls all file descriptors to dispatch ready handlers */
while(!error)
io.poll(error); /* this is where I expect error arise upon io stopped after signal of interrupt from console is conducted to asynchronous wait handler */
但是,即使停止了io服务,看起来调用poll总是会返回成功。因此程序不会因为循环条件的错误而退出。所以我的问题是,我是对的,是否有其他机制我错过了退出调用民意调查的循环?非常感谢。
答案 0 :(得分:1)
尝试通过io_service
,run()
,run_one()
或poll()
处理停止的poll_one()
事件循环未被指定为一个错误。 io_service::stop()
文档通过导致poll()
的后续调用立即返回poll()
来指定reset()
,从而影响io_service
。此外,io_service::run()
的正常退出记录为在io_service
停止时发生,强调尝试在已停止的run()
上处理事件循环不是错误:
io_service
函数的正常退出意味着stopped()
对象已停止(true
函数返回io_service
)。
要退出循环,请考虑更改谓词,以便循环在出错时或while (!error && !io.stopped())
io.poll(error);
已停止时停止:
{{1}}