您是否需要在处理程序抛出异常后重置asio :: io_service?

时间:2013-09-26 16:24:52

标签: c++ boost exception-handling boost-asio

虽然提升文档说

  

捕获异常后,运行run(),run_one(),poll()或   poll_one()调用可以重新启动而无需干预   调用reset()

我有不同的经历。

在异常处理程序中,我发现io_service处于停止状态,并且事实上任何后续添加异步工作的尝试都会失败,因此以下run()调用会立即退出。

这与我正在做的非常相似:

...
io_service ios;
do_receive(); // adds some async work to ios 
do try
{
    ios.run();
    break;
}
catch (std::exception const &)
{
    assert (ios.stopped()); //<----- ASSERTION DOESN'T TRIGGER. i.e ios is stopped
    ios.reset();            //<----- ...So I need to do this otherwise next call
                            //<----- to do_receive() fails to add more async work
                            //<----- causing next loop iteration's run() invocation
                            //<----- to exit immediately

    do_receive(); //same as above, adds async work to ios
}
while(1);

在尝试添加新的异步工作之前添加对io_service的reset()的调用似乎已经解决了问题,但是在我有几个线程的情况下,我无法看到这是如何扩展的调用run()。

如果任何处理程序抛出,catch块将在该线程上下文中调用reset,我猜这会对所有其他正在进行的操作造成严重干扰。

我在改进文档中做错了什么或遗漏了什么?

谢谢, 安德烈。

1 个答案:

答案 0 :(得分:2)

如果没有更多工作要做,io_service将自行停止;这可能就是这里发生的事情。如果要防止这种情况,可以通过创建io_service::work对象来实现。只要该对象存在,io_service就不会停止。