C++ 处理程序引发异常后,是否需要重置asio::io_服务?
尽管医生说 捕获异常后,运行()、运行一次()、轮询()或 poll_one()调用可以在不需要干预的情况下重新启动 调用重置() 我有不同的经历 在异常处理程序中,我发现io_服务处于停止状态,并且任何后续添加异步工作的尝试都会失败,因此下面的run()调用会立即退出 这与我正在做的非常相似: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;
...
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服务也将停止。