C++11 的新机器模型允许多处理器系统可靠地工作,wrt。对指令进行重组。
正如Meyers 和 Alexandrescu指出的那样,“简单”的双重检查锁定模式实现在 C++03 中并不安全
Singleton* Singleton::instance() {
if (pInstance == 0) { // 1st test
Lock lock;
if (pInstance == 0) { // 2nd test
pInstance = new Singleton;
}
}
return pInstance;
}
他们在他们的文章中表明,无论您作为程序员做什么,在 C++03 中,编译器都有太多的自由:允许以一种您无法确定最终只得到一个指令的方式重新排序指令的实例Singleton
。
我现在的问题是:
- 新的 C++11 机器模型的限制/定义现在是否限制了指令序列,即上述代码始终可以与 C++11 编译器一起使用?
- 当使用新的库设施(而不是这里的模拟)时,这个单例模式的安全 C++11 实现现在看起来
Lock
如何?