Search code examples
c++gccshared-ptr

Is it safe to return by value a shared_ptr that is guarded by mutex?


Here is a code sample:

class A {
  boost::mutex a_mutex;
  boost::shared_ptr<int> a;

  boost::shared_ptr<int> clone_a(void) {
    boost::lock_guard<boost::mutex> lock(a_mutex);
    return a;
  }
};

The suggestion is that the boost::shared_ptr copy constructor call on A::a will precede the boost::lock_guard destructor call despite of the compiler optimizations. So, is it safe to call A::clone_a() ?


Solution

  • If by "safe" you mean you won't get data races on a, then yes. It is exactly as you say.

    However, it won't protect further accesses to *a (or *clone_a()), as you probably know. I'm not sure, why is the method called "clone", as it doesn't clone anything.