最近经常使用 Boost.Asio。我非常喜欢这个库,因为它提供了一种从当今的多核系统中榨取性能的绝佳方法。
我曾多次问过自己这个问题,我认为在使用 Asio 进行异步调用时值得抛出关于对象生命周期/所有权的问题。
我反复遇到的问题是,您经常必须“过期”仍然有异步回调待处理的对象。如果该对象在调用回调之前超出范围,则不可避免地会发生问题。
为了解决这个问题,我开始使用boost::enable_shared_from_this
template 作为大多数基于 asio 的类的基类。这工作正常,但有点麻烦:通常这也意味着保护构造函数并向类添加工厂方法,以确保所有实例都是在共享指针内创建的。
我只是想知道其他人是如何解决这个问题的。我是用最好的方式来解决这个问题吗?或者我的 Asio.Foo 都错了?
讨论... :)
Using boost::enable_shared_from_this
这几乎就是做到这一点的方法。另外,看看使用boost::weak_ptr
如果您需要对不应该保留该对象的对象的引用(如果它们是唯一保留的引用)。
一个很好的使用例子weak_ptr
: I use enable_shared_from_this
在我的套接字类中使用boost::asio
. The boost::asio
框架是唯一通过读写处理程序存储对对象的持久引用的东西。因此,当调用套接字的析构函数时,我知道套接字已关闭,并且我可以在处理程序中“做一些事情”来清理该关闭的套接字。使用套接字的应用程序只有一个weak_ptr
引用它,它促进了shared_ptr
当它想要使用套接字时(通常是写入它)。尽管套接字的关闭处理程序通常会清除所有套接字,但可以检查该提升是否失败,以防套接字消失。weak_ptr
甚至在发生之前就适当地参考。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)