strand和io对象(比如tcp :: socket)是否需要担心关联io_service的生命周期?

时间:2014-08-12 18:25:00

标签: c++ c++11 boost boost-asio

io_service::strand的构造函数和tcp::socket之类的io对象引用了io_service个对象。如果io_service对象在使用其引用构造的io_service::strandtcp::socket之前破坏了该怎么办?

3 个答案:

答案 0 :(得分:1)

io_service::~io_service() documentation具体描述了这种情况以及解决方法

  

<强>说明

     

上述破坏序列允许程序简化   使用shared_ptr<>进行资源管理。对象的位置   生命周期与连接的生命周期(或其他一些因素)有关   异步操作序列),对象的shared_ptr   绑定到所有相关的异步操作的处理程序   用它。其工作原理如下:

     

当单个连接结束时,所有关联的异步操作   完成。相应的处理程序对象将被销毁   对对象的shared_ptr引用被销毁。关闭了   整个程序,调用io_service函数stop()来终止   尽快拨打任何run()电话。定义了io_service析构函数   上面会破坏所有处理程序,导致所有shared_ptr引用   要销毁的连接对象。

答案 1 :(得分:0)

其UB。

我的io_service用户类在io_service之后被销毁时,我收到了段错误。

答案 2 :(得分:0)

您描述的案例会导致崩溃。 io_service是强制性的,因为io_service执行对套接字,定时器和您自己的代码的相关异步调用的实际线程执行。为了保护您的代码免受此类灾难的影响,请在创建后立即将io_service :: work添加到您的io_service。在您不再需要io_service之后 - 停止工作和io_service。