sel*_*ord 10 c++ multithreading c++11
我有一个类似的类:
class A{
private:
boost::shared_ptr< Foo > m_pFoo;
}
Run Code Online (Sandbox Code Playgroud)
A的实例在GUI线程上被销毁,它们可以保存对Foo的最后一个引用.Foo的析构函数可能长时间运行,导致我的GUI线程出现意外暂停.在这种情况下,我想让Foo在一个单独的线程上被销毁,Foo是自包含的,并且它们立即被释放并不重要.
目前,我使用这样的模式:
A::~A(){
auto pMtx = boost::make_shared<boost::mutex>();
boost::unique_lock<boost::mutex> destroyerGate(*pMtx);
auto pFoo = m_pFoo;
auto destroyer = [pMtx,pFoo](){
boost::unique_lock<boost::mutex> gate(*pMtx);
};
m_pFoo.reset();
pFoo.reset();
s_cleanupThread->post(destroyer);
}
Run Code Online (Sandbox Code Playgroud)
基本上,在lambda中捕获它并锁定直到从对象释放.有没有更好的方法来实现这一目标?这似乎比它需要的更复杂.
A不应对 的目标的破坏负责m_pFoo。销毁 a 指向的资源shared_ptr是 的责任shared_ptr,因此在我看来,您不应该对内部发生实际对象销毁的线程进行微观管理~A。
我认为这里的一个很好的折衷方案是将与删除底层对象相关的逻辑取出~A并将其移至您在shared_ptr构造时提供的自定义删除器,而不是实现适合您需求的新型智能指针。如果您对当前的释放策略感到满意,我认为这是一个令人满意的方法。但我也同意其他人的观点,即您可能想要研究不涉及为每次释放创建新线程的策略。
smart_ptr 您可以在此处找到有关如何提供删除器的文档。向下滚动到“采用删除器的构造函数”(您也可能需要查找您正在使用的特定版本的 boost 的文档)。
| 归档时间: |
|
| 查看次数: |
650 次 |
| 最近记录: |