2

尽管 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 文档中做错了什么或遗漏了什么吗?

谢谢,安德里亚。

4

1 回答 1

2

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

于 2013-09-26T16:37:02.543 回答