我已经阅读了很多关于线程安全双重检查锁定的问题(对于单例或惰性初始化)。在一些线程中,答案是模式完全被破坏,其他人提出了解决方案。
所以我的问题是:有没有办法在 C++ 中编写完全线程安全的双重检查锁定模式?如果是的话,它是什么样子的。
我们可以假设 C++11,如果这让事情变得更容易的话。据我所知,C++11 改进了内存模型,可以产生所需的改进。
我确实知道在 Java 中可以通过使双重检查 protected 变量变为 volatile 来实现。由于 C++11 的大部分内存模型都是从 Java 中借来的,所以我认为这是可能的,但是如何呢?
最佳答案
对延迟初始化的 Singleton 使用静态局部变量,如下所示:
MySingleton* GetInstance() {
static MySingleton instance;
return &instance;
}
(C++11) 标准已经保证静态变量以线程安全的方式进行初始化,而且它的实现似乎至少与您自己编写的任何东西一样健壮和高性能。
初始化的线程安全可以在(C++11)标准的§6.7.4中找到:
If control enters the declaration concurrently while the variable is being initialized, the concurrent execution shall wait for completion of the initialization.
关于C++11:延迟初始化的安全双重检查锁定。可能的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12302057/