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.
我现在的问题是:
Lock这里的模拟)时,这个Singleton模式的安全C++ 11实现现在怎么样?如果pInstance是常规指针,则代码具有潜在的数据竞争 - 指针上的操作(或任何内置类型,就此而言)不保证是原子的(编辑:或有序)
如果pInstance是std::atomic<Singleton*> 并且 Lock内部使用an std::mutex来实现同步(例如,如果Lock实际上是std::lock_guard<std::mutex>),则代码应该是数据竞争免费的.
请注意,你需要两个明确的锁定和原子pInstance以达到正确的同步.