小编sel*_*ord的帖子

在另一个线程上安全地释放资源

我有一个类似的类:

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中捕获它并锁定直到从对象释放.有没有更好的方法来实现这一目标?这似乎比它需要的更复杂.

c++ multithreading c++11

10
推荐指数
1
解决办法
650
查看次数

boost :: optional的隐式强制转换为bool会消失吗?

我开始将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)

c++ boost optional

8
推荐指数
1
解决办法
2793
查看次数

标签 统计

c++ ×2

boost ×1

c++11 ×1

multithreading ×1

optional ×1