对于pre-c ++ 11编译器,返回本地静态对象线程是安全的

NDe*_*iny 4 c++ singleton multithreading c++11

这个单例线程对于前C++ 11编译器是否安全?正如我们对C++ 11所知,它是线程安全的.

class Singleton
{
private:
   Singleton(){};

public:
   static Singleton& instance()
   {
      static Singleton INSTANCE;
      return INSTANCE;
   }
};
Run Code Online (Sandbox Code Playgroud)

Sha*_*our 7

在C++ 11中,使这个线程安全的是C++ 11标准部分6.7 声明声明中的以下内容(强调我的):

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

而前C++ 11部分6.7说:

[...]否则在第一次控制通过其声明时初始化这样的对象; 这样的对象在初始化完成时被认为是初始化的.如果初始化通过抛出异常退出,则初始化未完成,因此下次控件进入声明时将再次尝试.[...]

这与C++ 11没有相同的保证,所以看起来它没有被指定为C++ 11,因此你不能指望它.虽然这并不妨碍实施做出更有力的保证.

这是有道理的,因为在C++ 11之前,内存模型不包括线程.