多线程 – C 11中的双重锁定模式?
发布时间:2020-12-14 16:21:35 所属栏目:Java 来源:网络整理
导读:C 11的新机型允许多处理器系统可靠地工作,wrt.重组指令. 正如Meyers和Alexandrescu所指出的那样,C 03中的“简单”双重锁定模式的实现是不安全的 Singleton* Singleton::instance() { if (pInstance == 0) { // 1st test Lock lock; if (pInstance == 0) { //
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编译器一起使用? 解决方法
如果pInstance是一个常规的指针,那么这个代码就有一个潜在的数据竞争 – 对指针的操作(或任何内置的类型)就不能保证是原子的(编辑或者有序)
如果pInstance是一个std :: atomic< Singleton *>而Lock在内部使用std :: mutex实现同步(例如,如果Lock实际上是std :: lock_guard< std :: mutex>),代码应该是数据无限制的. 请注意,您需要显式锁定和原子pInstance才能实现正确的同步. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |