我有一个类似的类:
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中捕获它并锁定直到从对象释放.有没有更好的方法来实现这一目标?这似乎比它需要的更复杂.
我开始将vc ++ 10/boost 1.48代码库移植到vc ++ 12/boost 1.57,我收到一个错误,boost :: optional无法转换为bool.我认为这是boost :: optional的一个特性,它被删除了吗?
例:
bool fizz(){
boost::optional<int32_t> buzz;
return buzz;
}
Run Code Online (Sandbox Code Playgroud)
给
Error 21 error C2440: 'return' : cannot convert from 'boost::optional<int32_t>' to 'bool'
Run Code Online (Sandbox Code Playgroud)