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

时间:2009-12-26 08:13:00

标签: c++ multithreading static member-variables

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

Thread-safe static variables without mutexing?

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

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

class TestClass
{
public:
   static MyClass m_instance;
}

Myclass TestClass::m_instance;

提前致谢!

2 个答案:

答案 0 :(得分:34)

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

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

答案 1 :(得分:2)

是(*)。初始化全局静态时,只有一个线程,并且在其上调用所有构造函数。但是,对于函数的静态不是这样。

(*)通过在某些构造函数中创建线程并在这些线程上调度某些初始化阶段,可以使全局静态不是线程安全的。在这种情况下,通常的线程安全规则适用。