多线程 – C 11中的双重锁定模式?

前端之家收集整理的这篇文章主要介绍了多线程 – C 11中的双重锁定模式?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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才能实现正确的同步.

猜你在找的Java相关文章