虽然提升文档说
捕获异常后,运行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,我猜这会对所有其他正在进行的操作造成严重干扰。
我在改进文档中做错了什么或遗漏了什么?
谢谢, 安德烈。
答案 0 :(得分:2)
如果没有更多工作要做,io_service
将自行停止;这可能就是这里发生的事情。如果要防止这种情况,可以通过创建io_service::work
对象来实现。只要该对象存在,io_service
就不会停止。