c++ - 使用 Boost.Asio 时确保有效对象生命周期的最佳方法是什么?

标签 c++ multithreading boost asynchronous boost-asio

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

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

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

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

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

讨论... :)

最佳答案

使用 boost::enable_shared_from_this 几乎可以做到这一点。此外,如果您需要对不应保留对象的对象的引用,如果它们是唯一保留的引用,请考虑使用 boost::weak_ptr

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

关于c++ - 使用 Boost.Asio 时确保有效对象生命周期的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/423739/

相关文章:

multithreading - 使用 OMP 循环展开

c++ - io_service::run() async_* 函数的处理顺序

c++ - boost::asio async_accept 拒绝连接

c++ - spoj 底部的强连接组件

C++ 编译错误 : reference to constructor is ambiguous

multithreading - 如何在单独的线程中运行 `Observable`?

c++ - 动态 equal_to 函数 unordered_map boost

c++ - 3D 中线和三角形的交点

c++ - 为什么这些掷骰子的结果如此均匀?

c# - MySql - 多线程软件,如何锁定行以防止其他线程读取