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

Is returning local static object thread safe for pre-c++11 compilers

本文关键字:静态 对象 线程 安全 是否 返回 c++11 编译器 对于      更新时间:2023-10-16

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

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

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

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

而 C++11 之前的第 6.7 节说:

[...]否则,此类对象在控件首次通过时初始化 通过其声明;此类对象被视为初始化 完成其初始化。如果初始化退出时间 抛出异常,初始化未完成,因此它将 下次控件进入声明时重试。[...]

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

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