26

根据以下资源,在 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;

提前致谢!

4

2 回答 2

37

这更多的是函数作用域静态变量与其他所有类型的静态变量的问题,而不是作用域与全局变量的问题。

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

于 2009-12-26T08:35:32.803 回答
4

是的(*)。当全局静态初始化时,只有一个线程,所有的构造函数都在它上面被调用。但是,对于函数的静态来说,情况并非如此。

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

于 2009-12-26T08:26:56.567 回答