C ++ 11:安全双重检查锁定以进行延迟初始化。可能?

时间:2012-09-06 14:10:49

标签: c++ c++11 thread-safety double-checked-locking

考虑到线程安全的双重检查锁定(对于单例或懒惰初始化),我已经阅读了很多问题。在某些线程中,答案是模式完全被破坏,其他人建议解决方案。

所以我的问题是:有没有办法在C ++中编写一个完全线程安全的双重检查锁定模式?如果是这样,它看起来如何。

我们可以假设C ++ 11,如果这样可以让事情变得更容易。据我所知,C ++ 11改进了内存模型,可以产生所需的改进。

我知道通过使用双重检查保护变量volatile可以在Java中实现。由于C ++ 11从Java中借用了大部分内存模型,所以我认为它可能,但是如何?

2 个答案:

答案 0 :(得分:17)

只需使用静态局部变量进行延迟初始化的单例,如下所示:

MySingleton* GetInstance() {
  static MySingleton instance;
  return &instance; 
}

(C ++ 11)标准已经保证静态变量以线程安全的方式初始化,并且它的实现似乎至少与您自己编写的任何内容一样强大且高效。

初始化的安全性可以在(C ++ 11)标准的第6.6.4节中找到:

  

如果控件在初始化变量时同时进入声明,则并发执行应等待初始化完成。

答案 1 :(得分:3)

由于您希望看到有效的DCLP C ++ 11实现,因此这里有一个。

该行为完全是线程安全的,与Grizzly的答案中的dataframe rows相同。

GetInstance()