C++静态成员变量初始化是否是线程安全的?

Var*_*una 24 c++ static multithreading member-variables

根据以下资源,在C++(特别是Visual C++)中,作用域静态变量初始化不是线程安全的.但是,全局静态变量是安全的.

线程安全的静态变量没有静音?

http://blogs.msdn.com/oldnewthing/archive/2004/03/08/85901.aspx

那么,遵循静态成员变量的代码是否是线程安全的?

class TestClass
{
public:
   static MyClass m_instance;
}

Myclass TestClass::m_instance;
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Mar*_*tos 35

这更像是函数范围的静态变量与其他类型的静态变量的问题,而不是范围与全局变量.

所有非函数范围的静态变量都是在main()之前构造的,而只有一个活动线程.函数范围静态变量是在第一次调用其包含函数时构造的.该标准没有提到在多线程上调用函数时如何构造函数级静态的问题.但是,我使用的每个实现都使用构造函数周围的锁(带有两次检查的标志)来保证线程安全.

  • gcc使用锁来使函数级静态线程安全(可以通过标志禁用).大多数(所有?)版本的Visual C++没有线程安全的功能级静态. (7认同)
  • 该标准也没有说明如何使用多个线程构造非函数范围的静态.IIRC所保证的是在执行翻译单元中的任何其他代码之前初始化对象(即,初始化程序不调用的代码).如果你认为代码可能在main()开始执行后加载了一个dll,你会发现这是现实中最好的保证.这是特定的线程规范,可以进一步保证,而不是C++标准. (4认同)