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; }
他们在their article表示,无论你做什么作为程序员,在C 03编译器有太多的自由:允许重新排序指令,你不能确定你最终只有一个Singleton实例.
我现在的问题是:
>新的C11机器模型的限制/定义现在约束了指令序列,上述代码将始终与C 11编译器一起使用?
>如何使用新的图书馆设施(而不是这里的模拟锁),这个Singleton模式的安全性如何呢?
解决方法
如果pInstance是一个常规的指针,那么这个代码就有一个潜在的数据竞争 – 对指针的操作(或任何内置的类型)就不能保证是原子的(编辑或者有序)
如果pInstance是一个std :: atomic< Singleton *>而Lock在内部使用std :: mutex实现同步(例如,如果Lock实际上是std :: lock_guard< std :: mutex>),代码应该是数据无限制的.
请注意,您需要显式锁定和原子pInstance才能实现正确的同步.