I / O服务停止后的轮询是什么

时间:2014-04-03 02:39:25

标签: boost-asio

最近我和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总是会返回成功。因此程序不会因为循环条件的错误而退出。所以我的问题是,我是对的,是否有其他机制我错过了退出调用民意调查的循环?非常感谢。

1 个答案:

答案 0 :(得分:1)

尝试通过io_servicerun()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}}