这是一个正确的C++ 11双重检查锁定版本与shared_ptr?

Hau*_*bel 6 c++ multithreading c++11

Jeff Preshing的这篇文章指出双重检查锁定模式(DCLP)在C++ 11中是固定的.用于此模式的经典示例是单例模式,但我碰巧有不同的用例,我仍然缺乏处理"原子<>武器"的经验 - 也许这里有人可以帮助我.

下面的代码是否是Jeff在"使用C++ 11顺序一致的原子"中所描述的正确的DCLP实现?

class Foo {
    std::shared_ptr<B> data;
    std::mutex mutex;

    void detach()
    {
      if (data.use_count() > 1)
      {
        std::lock_guard<std::mutex> lock{mutex};
        if (data.use_count() > 1)
        {
          data = std::make_shared<B>(*data);
        }
      }
    }

public:
  // public interface
};
Run Code Online (Sandbox Code Playgroud)

Nie*_*elk 0

根据您的消息来源,我认为您仍然需要在第一次测试之前和第二次测试之后添加线程围栏。

std::shared_ptr<B> data;
std::mutex mutex;

void detach()
{
  std::atomic_thread_fence(std::memory_order_acquire);
  if (data.use_count() > 1)
  {
    auto lock = std::lock_guard<std::mutex>{mutex};
    if (data.use_count() > 1)
    {
      std::atomic_thread_fence(std::memory_order_release);
      data = std::make_shared<B>(*data);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)