2013-09-26 74 views
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。

回答

2

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

+0

天哪!你是对的!我没有注意到在处理程序_before_中引发异常,它可能会向io_service添加其他工作(通过“链接”以下处理程序),因此退回到catch块中,因为它停止工作,因此io_service已停止。我可以重新排列操作,以便在将代码添加到io_service后添加工作,但这很脆弱并且难以维护,所以我将去寻找io_service :: work路线。 – abigagli

+0

“只要该对象存在,'io_service'不会自行停止。”根本不是真的。无论工作对象是否存在,如果调用'io_service-> stop();',io_service也会停止。 – Kenji

相关问题