【问题标题】:What's the best way of ensuring valid object lifespan when using Boost.Asio?使用 Boost.Asio 时确保有效对象寿命的最佳方法是什么?
【发布时间】:2010-09-30 05:44:37
【问题描述】:

最近玩了很多 Boost.Asio。我非常喜欢这个库,因为它提供了一种从当今多核系统中榨取性能的绝妙方法。

我曾多次问过自己一个问题,我认为在使用 Asio 进行异步调用时,关于对象生命周期/所有权的问题值得一提。

我反复遇到的问题是,您经常不得不“过期”一个仍然有异步回调待处理的对象。如果该对象在调用回调之前超出范围,则不可避免地会发生故障。

为了解决这个问题,我已将boost::enable_shared_from_this 模板用作大多数基于 asio 的类的基类。这工作正常,但有点麻烦:通常这也意味着保护构造函数并向类添加工厂方法以确保在 shared_ptr 内创建所有实例。

我只是想知道其他人是如何解决这个问题的。我是不是最好的办法?还是我的 Asio.Foo 都错了?

讨论... :)

【问题讨论】:

    标签: c++ multithreading boost asynchronous boost-asio


    【解决方案1】:

    使用boost::enable_shared_from_this 几乎就是这样做的方法。此外,如果您需要对不应保留对象的对象的引用,如果它们是唯一保留的引用,请查看使用 boost::weak_ptr

    使用weak_ptr 的一个很好的例子:我在使用boost::asio 的套接字类中使用enable_shared_from_thisboost::asio 框架是唯一通过读写处理程序存储对对象的持久引用的东西。因此,当调用套接字的析构函数时,我知道套接字已关闭,我可以在处理程序中“做一些事情”以清理该关闭的套接字。使用套接字的应用程序只有一个weak_ptr 引用,当它想要使用套接字(通常是写入它)时,它会将其提升为shared_ptr。在套接字消失的情况下,可以检查该提升是否失败,尽管套接字的关闭处理程序通常会在此之前适当地清理所有 weak_ptr 引用。

    【讨论】:

      【解决方案2】:

      这种事情不仅限于 Asio。我最近写了一个线程池类(使用 Boost::Thread),它有几乎相同的问题——线程会调用创建它们的线程池类,以查看他们接下来必须执行的任务,使用普通指针如果线程池类在子线程仍在运行的情况下被销毁,程序就会崩溃。我通过在线程池析构函数中的每个线程上调用 interrupt 来处理它,然后等待所有线程退出,然后让析构函数返回。

      如果我理解您的共享指针解决方案,它似乎在做同样的一般事情——确保项目在不再需要之前不会被销毁。也是一个美观的解决方案。对于这类问题,我没有看到更好的答案。

      【讨论】:

      • 有趣的是,您提到了这种情况:我的同事(在这里称为 Alan)和您做同样的事情,我提到了我找到的“解决方案”,因为对我来说这是同样的问题。不过,我仍然对此不满意:我不喜欢缺乏确定性,但是,这对你来说是线程
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 2010-11-08
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多