C++ 对于c+;之前的版本,是否返回本地静态对象线程安全+;11个编译器
对于C++11之前的编译器,此单例线程安全吗? 正如我们所知,对于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节中的以下声明语句(强调我的声明): 所有具有静
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