2
虽然提升文档说您是否需要在处理程序抛出异常后重置asio :: io_service?
的异常被抓后,run()中,run_one(),轮询()或 poll_one()调用,可以无需介入 呼叫复位重新启动()
我有不同的经历。
在异常处理程序中,我发现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块会在该线程上下文中调用重置,我猜这会严重干扰所有其他正在运行的操作。
我做错了什么或错过了助推器文档中的东西?
谢谢, Andrea。
天哪!你是对的!我没有注意到在处理程序_before_中引发异常,它可能会向io_service添加其他工作(通过“链接”以下处理程序),因此退回到catch块中,因为它停止工作,因此io_service已停止。我可以重新排列操作,以便在将代码添加到io_service后添加工作,但这很脆弱并且难以维护,所以我将去寻找io_service :: work路线。 – abigagli
“只要该对象存在,'io_service'不会自行停止。”根本不是真的。无论工作对象是否存在,如果调用'io_service-> stop();',io_service也会停止。 – Kenji