C++ 处理程序引发异常后,是否需要重置asio::io_服务?

C++ 处理程序引发异常后,是否需要重置asio::io_服务?,c++,boost,exception-handling,boost-asio,C++,Boost,Exception Handling,Boost Asio,尽管医生说 捕获异常后,运行()、运行一次()、轮询()或 poll_one()调用可以在不需要干预的情况下重新启动 调用重置() 我有不同的经历 在异常处理程序中,我发现io_服务处于停止状态,并且任何后续添加异步工作的尝试都会失败,因此下面的run()调用会立即退出 这与我正在做的非常相似: ... io_service ios; do_receive(); // adds some async work to ios do try { ios.run(); break;

尽管医生说

捕获异常后,运行()、运行一次()、轮询()或 poll_one()调用可以在不需要干预的情况下重新启动 调用重置()

我有不同的经历

在异常处理程序中,我发现io_服务处于停止状态,并且任何后续添加异步工作的尝试都会失败,因此下面的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_服务ios;
_receive();//向ios添加一些异步工作
试试看
{
ios.run();
打破
}
捕获(标准::异常常量&)
{

断言(ios.stopped())/如果没有更多的工作要做,
io\u服务
将自动停止;这可能就是这里发生的情况。如果你想防止这种情况发生,你可以通过创建一个
io\u服务::工作
对象来实现。只要该对象存在,
io\u服务
就不会自动停止。

天哪!你说得对!我没有注意到例外在处理程序向io_服务添加额外工作(通过“链接”以下处理程序)之前,在处理程序中抛出了on,因此将其解回到catch块时,io_服务会因为无法工作而停止。我可以重新安排操作,以便在向io_服务添加工作后抛出代码,但这很脆弱,很难维护,因此我将选择io_服务::工作路由。“只要对象存在,
io_服务
将不会自行停止。”一点也不正确。如果调用
io\u service->stop();
,无论工作对象是否存在,io\u服务也将停止。