C++ 对于c+;之前的版本,是否返回本地静态对象线程安全+;11个编译器

C++ 对于c+;之前的版本,是否返回本地静态对象线程安全+;11个编译器,c++,multithreading,c++11,singleton,C++,Multithreading,C++11,Singleton,对于C++11之前的编译器,此单例线程安全吗? 正如我们所知,对于C++11,它是线程安全的 class Singleton { private: Singleton(){}; public: static Singleton& instance() { static Singleton INSTANCE; return INSTANCE; } }; 在C++11中,使此线程安全的是6.7节中的以下声明语句(强调我的声明): 所有具有静

对于C++11之前的编译器,此单例线程安全吗? 正如我们所知,对于C++11,它是线程安全的

class Singleton
{
private:
   Singleton(){};

public:
   static Singleton& instance()
   {
      static Singleton INSTANCE;
      return INSTANCE;
   }
};

在C++11中,使此线程安全的是
6.7节中的以下声明语句(强调我的声明):

所有具有静态变量的块范围变量的零初始化(8.5) 存储持续时间(3.7.1)或线程存储持续时间(3.7.2)为 在进行任何其他初始化之前执行。[……]否则 这样的变量在控件第一次通过时初始化 其宣言;这样的变量被认为是在 完成其初始化。如果初始化通过退出 引发异常时,初始化未完成,因此将 下次控件进入声明时重试如果 控件在调用变量时并发输入声明 初始化后,并发执行应等待完成 初始化时的状态。[…]

而C++11之前的部分
6.7
则说:

[…]否则,在控件第一次通过时初始化此类对象 通过其宣言;这样的对象被认为是初始化的 完成其初始化。如果初始化通过退出 引发异常时,初始化未完成,因此将 下次控件进入声明时重试。[…]

它没有与C++11相同的保证,因此在C++11之前它似乎没有被指定,因此您不能指望它。尽管这并不妨碍实现提供更有力的保证


这是有意义的,因为C++11之前的内存模型不包括线程。

忘记线程安全,这段代码有效吗?@MorphingDragon看不出它为什么无效…@MorphingDragon为什么无效???@MorphingDragon:您只需要添加一个默认构造函数实现,它就可以编译到C++11。标准甚至不知道线程是什么,所以要做到线程安全有点困难。不过,您的实现可能会提供这样的保证。标准引号为+1。注意,这并没有阻止编译器pre-C++11