在多线程程序中增强weak_ptr以实现资源池

And*_*ain 4 c++ multithreading boost smart-pointers

我正在考虑使用boost :: weak_ptr来实现一个对象池,这样当没有人使用其中一个对象时它们就会被收获.但我担心的是,它是一个多线程环境,似乎最后一个shared_ptr与一个超出范围的对象和一个从weak_ptr构造的新shared_ptr之间存在竞争条件.通常情况下,您可以通过锁定或其他方式保护此类操作; 但是,这里的重点是你不知道shared_ptr何时可能超出范围.

我是否误解了关于boost :: shared_ptr和boost :: weak_ptr的事情?如果没有,是否有人对如何做有任何好的建议?

谢谢.

安德鲁

Chr*_*ung 11

要使用a weak_ptr,通常需要通过构造a来获取强引用shared_ptr.最后一步是原子的:您要么获得强引用,要么bad_weak_ptr抛出异常.(另外,调用lock()weak_ptr,并要么得到一个有力的参考或空).

示例(有lock();容易适应其他风格):

void do_something(weak_ptr<foo> weak) {
    // Grab strong reference
    shared_ptr<foo> strong(weak.lock());
    if (strong) {
        // We now have a strong reference to use
    } else {
        // No strong references left; object already freed
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我相信没有必要测试你的shared_ptr是否有效,因为如果你的week_ptr指向被删除的对象,构造函数将抛出bad_weak_ptr异常.或者你应该使用weak_ptr <T> :: lock(),它不会抛出但可以返回指向NULL的shared_ptr. (3认同)