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

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

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

所以我的问题是:有没有办法在 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/

相关文章:

c++ - 如何删除 peer if-else 分支中的冗长句子

java - 这个字典函数是线程安全的(ConcurrentHashMap+AtomicInteger)吗?

java - 来自多个线程的数组的非锁定交互(在 Java 中)

c++ - 在 std::vector 上运行的多个线程:在这种情况下我需要锁吗?

c++ - 成员函数指针作为构造函数参数

c++ - 如何将十六进制文件转换成二进制文件?

c++ - 类属性包括模板类的实例(错误 C3857)

c++ - 为什么模板内部的类型检查更严格?

c++ - std::unique_ptr<T[]> 和自定义分配器删除器

c# - 使我的代码线程安全时遇到问题