2017-10-25 13 views
0

ASIOコールバックでエラーがスローされた場合、非同期処理を再開するのは安全ですか?ブーストASIO:ハンドラ例外からの回復

要するに、次のコードにはメリットがありますか?

void runAsioLoop() 
{ 
    boost::asio::io_service::work work(this->m_ioService); 
    boost::system::error_code unused; 

    while (m_running) { 
     try { 
      this->m_ioService.run(unused); 
      this->m_ioService.reset(); 
     } catch (...) { 
      std::cerr << "*** An error happened\n"; 
     } 
    } 
} 

答えて

1

それは動作するはずですが、より良いイディオムは次のとおりです。

for (;;) { 
    try { 
     svc.run(); 
     break; // exited normally 
    } catch (std::exception const &e) { 
     logger.log(LOG_ERR) << "[eventloop] An unexpected error occurred running a task: " << e.what(); 
    } catch (...) { 
     logger.log(LOG_ERR) << "[eventloop] An unexpected error occurred running a task"; 
    } 
} 

は、ここでのドキュメントです:リンクのhttp://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/reference/io_service.html#boost_asio.reference.io_service.effect_of_exceptions_thrown_from_handlers

+0

感謝を。 run()が何もしなくても上記のコードサンプルが100%CPU使用率を引き起こすのではないでしょうか?私は自分のスレッドでそれぞれのioserviceを実行します。 – James

+0

ループの終了が何もない場合、通常のように – sehe

関連する問題