2017-10-25 3 views
0

Wenn ein ASIO-Callback einen Fehler auslöst, ist es sicher, die asynchrone Verarbeitung fortzusetzen?Boost ASIO: Wiederherstellung von Handlerausnahmen

Kurz gesagt, hat der folgende Code einen Wert?

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"; 
     } 
    } 
} 

Antwort

1

Es sollte funktionieren, aber die bessere Idiom ist:

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"; 
    } 
} 

Hier ist die Dokumentation für sie: 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

Danke für den Link. Wird das obige Codebeispiel zu 100% CPU-Auslastung führen, wenn nichts für run() zu tun ist? Ich betreibe jeden ioservice in einem eigenen Thread. – James

+0

Wenn nichts läuft, endet die Schleife wie üblich – sehe