当io_service被螺纹时,在boost.asio中进行异常处理
Exception handling in Boost.Asio when io_service is threaded
如果应用程序只有一个 io_service
对象并且是螺纹的(请参见下面的代码),如果一个异步处理程序中的一位抛出异常,会发生什么。它如何传播,更重要的是,什么是处理它们的最佳方法。
std::list< boost::shared_ptr< the_client > > clients_list;
for(int i = 0; i < n_threads; i++)
{
clients_list.insert(boost::make_shared< the_client >( io_service, server_host, server_port ));
}
for(unsigned int i = 0; i < n_threads; i++)
{
threads.create_thread(boost::bind(&boost::asio::io_service::run, boost::ref(io_service)));
}
for(std::list< boost::shared_ptr< the_client > >::iterator itr = clients_list.begin(); itr != clients_list.end(); ++itr)
{
(*itr)->connect_to_server_and_run_statemachine();
}
此处the_client::connect_to_server_and_run_statemachine()
设置了与服务器的连接并启动异步连接处理。
我知道一个关于类似主题的问题,但这不考虑多线程IO_Service方案。
什么都没有发生。如果您在某个地方捕获异常,则catch
块处理它。否则,未被发现的例外终止了该过程。
应该如何处理它取决于您想发生的事情。如果不应该发生例外,请让它终止该过程。如果您想吃或处理异常,请编写一个将io_service::run
包装在try
/catch
块中的函数,然后将线程运行。
我不喜欢将情报远离代码。我首选的解决方案是,除非有真正的致命错误,否则永远不要使我的异步功能抛出异常。如果异步函数知道如何处理可能会抛出的异常,则应抓住它。
但是,如果在您的应用程序中有意义,请包装run
是完全可以接受的。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 从 Boost ASIO 获取 epoll 描述符 io_service对象
- 如何在 Boost.Asio 中使用 Zero-copy sendmsg/receive
- C++ Boost::asio串行通信与Arduino无法写入
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 执行时使用 boost::asio::d eadline_timer 时出错
- Boost.Asio/OpenSSL HTTPS GET certificate trouble
- C++ boost::asio::ip::tcp::acceptor 有时不接受连接器?
- boost::asio data owning `ConstBufferSequence`
- 如何替换此示例代码片段中已弃用的handler_type_t或 boost::asio::handler_type?
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 如何将boost::asio::d eadline_timer 与Qt一起使用?
- 将更高的优先级设置为 boost::asio 线程处理进程
- Async_read_until限制读取的字节大小(Boost::asio)
- Boost Asio - boost::bind 导致程序崩溃
- 使用Asio(Boost)通过网络发送灵活的数据量