jkp*_*jkp 13 c++ multithreading boost asynchronous boost-asio
最近和Boost.Asio一起玩了很多.我非常喜欢这个库,因为它提供了一种从当今的多核系统中挤出性能的绝佳方法.
我问自己几次的问题,我认为在与Asio进行异步调用时,有必要抛弃对象的生命周期/所有权.
我反复遇到的问题是,你经常需要"过期"一个仍然有异步回调的对象.如果在调用回调之前该对象超出范围,则事物不可避免地会爆炸.
为了解决这个问题,我已经将boost::enable_shared_from_this模板用作大多数基于asio的类的基类.这可以正常工作,但这有点麻烦:通常这也意味着保护构造函数并向类中添加工厂方法以确保在shared_ptr中创建所有实例.
我只是想知道其他人是如何解决这个问题的.我是最好的方式吗?或者我的Asio.Foo都错了?
讨论... :)
这种事不只限于Asio。我最近编写了一个线程池类(使用 Boost::Thread),它有几乎相同的问题——线程将调用创建它们的线程池类,以使用普通指针来查看它们接下来必须执行的任务如果线程池类在子线程仍在运行的情况下被销毁,程序就会崩溃。我通过调用interrupt线程池析构函数中的每个线程来处理它,然后等待所有线程退出,然后再让析构函数返回。
如果我理解你的共享指针解决方案,它似乎在做同样的事情——确保该项目在不再需要之前不会被销毁。这也是一个美观的解决方案。对于此类问题,我看不到更好的答案。