尽管 boost 文档说
捕获异常后,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 块将在该线程上下文中调用重置,我猜这会严重扰乱所有其他正在进行的操作。
我在 boost 文档中做错了什么或遗漏了什么吗?
谢谢,安德里亚。