C++ 11中的双重锁定模式?

tow*_*owi 11 singleton multithreading double-checked-locking c++11

C++ 11的新机器模型允许多处理器系统可靠地工作.重组指示.

正如Meyers和Alexandrescu指出的那样,"简单"的双重检查锁定模式实现在C++ 03中并不安全

Singleton* Singleton::instance() {
  if (pInstance == 0) { // 1st test
    Lock lock;
    if (pInstance == 0) { // 2nd test
      pInstance = new Singleton;
    }
  }
  return pInstance;
}
Run Code Online (Sandbox Code Playgroud)

他们在文章中表明,无论你作为程序员做什么,在C++ 03中,编译器都有太多的自由:允许以一种你无法确定最终只有一个的方式重新排序指令的例子Singleton.

我现在的问题是:

  • 新的C++ 11机器模型的限制/定义现在是否限制了指令序列,上述代码将始终与C++ 11编译器一起使用?
  • 当使用新的库设施(而不是Lock这里的模拟)时,这个Singleton模式的安全C++ 11实现现在怎么样?

Joh*_*esD 5

如果pInstance是常规指针,则代码具有潜在的数据竞争 - 指针上的操作(或任何内置类型,就此而言)不保证是原子的(编辑:或有序)

如果pInstancestd::atomic<Singleton*> 并且 Lock内部使用an std::mutex来实现同步(例如,如果Lock实际上是std::lock_guard<std::mutex>),则代码应该是数据竞争免费的.

请注意,你需要两个明确的锁定和原子pInstance以达到正确的同步.

  • @towi - 是的,它会的.`std :: atomic <>的所有操作都默认为完全顺序一致的内存排序,必须明确请求较弱的排序.顺序一致意味着每个线程看到所有操作都以完全相同的顺序发生,就好像所有操作都是完全序列化的一样. (2认同)