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

gex*_*ide 12 c++ thread-safety double-checked-locking c++11

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

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

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

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

Gri*_*zly 17

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

MySingleton* GetInstance() {
  static MySingleton instance;
  return &instance; 
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 疯了吧.为什么,为什么,如果它可以**永远不是'null`,你会不会返回一个指针? (11认同)
  • @Grizzly:如果一个对象不应该是可复制的,那么由对象强制执行.如果一个对象应该有一个全局可访问的实例,那么应该有一个处理它的函数(就像你的那样).这两件事是分开的,没有理由将它们结合起来.这就是Singleton模式愚蠢的原因. (2认同)