Boost weak_ptr's in a multi-threaded program to implement a resource pool

前端 未结 3 1693
时光说笑
时光说笑 2020-12-11 07:32

I\'m thinking of using boost::weak_ptr to implement a pool of objects such that they will get reaped when nobody is using one of the objects. My concern, though, is that it

相关标签:
3条回答
  • 2020-12-11 07:59

    Yes, ish. In terms of accessing the pointers, Boost should have made everything safe; that's part of their point.

    However, if you're expecting to have a delay between when the last shared_ptr goes out, and when you want to make the next one, you'll get a null pointer. (If you're checking appropriately, you should then have an appropro fail case).

    But you can't end up with an invalid shared_ptr

    0 讨论(0)
  • 2020-12-11 08:01

    Both boost::weak_ptr and boost::shared_ptr are similar if it comes to thread safety: they are not thread safe if there is a risk that object is going to be destroyed somewhere. If your object referenced in boost::shared_ptr or weak_ptr is being referenced permanently somewhere, then use can use shared/weak ptrs without any risk.

    But if some operation is going to dereference the last living instance of object, then at that time you cannot do some operations on weak_ptr: in particular: you cannot assign weak_ptr to another weak_ptr because it uses shared_ptr internally. Also, you cannot use lock because the result is undefined. Also, expired() method is useless to: it may return true, but then next line of your code, your object might be already expired.

    0 讨论(0)
  • 2020-12-11 08:09

    To use a weak_ptr, you normally have to grab a strong reference by constructing a shared_ptr with it. This last step is atomic: you either get a strong reference back, or you get a bad_weak_ptr exception thrown. (Alternatively, call lock() on the weak_ptr, and either get a strong reference or null.)

    Example (with lock(); easy enough to adapt to the other style):

    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
        }
    }
    
    0 讨论(0)
提交回复
热议问题