对于 c++11 之前的编译器,返回本地静态对象线程是否安全
Is returning local static object thread safe for pre-c++11 compilers
这个单例线程对于 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 之前,内存模型不包括线程。
相关文章:
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 我可以读取静态对象中的文件.txt吗?C++
- 通过 Gazebo 世界插件将静态对象附加到机器人链接
- 将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
- 完全释放静态对象内存
- 静态对象指针
- C++文件中.cpp静态对象声明
- C++类中定义静态对象
- 在初始化类的静态对象之前,是否保证初始化该类的静态成员?
- 静态对象如何调用私有构造函数
- cpp 静态对象实例化
- 等效于 Java 静态对象类C++
- 我怎么知道C++编译器是否制作线程安全的静态对象代码
- 在dlclose()之前破坏的静态对象
- 有没有办法为静态对象成员定义一个符合开关标准的常量?
- c++ 防止类共享静态对象
- 什么时候构造函数为静态对象
- 为什么本地静态对象的初始化使用隐藏的防护标志?