c ++线程安全的静态构造函数

时间:2010-02-17 12:43:22

标签: c++ thread-safety

假设:

void getBlah() {
  static Blah* blah = new Blah();
  return blah;
}

在多线程设置中,是否可能多次调用新的Blah()?

谢谢!

3 个答案:

答案 0 :(得分:4)

C ++标准不保证静态初始化的线程安全性 - 您应该将静态初始化视为需要显式同步。

Alexander Gessler的话:

  

如果控制进入声明   在对象存在的同时   初始化,并发执行   等待完成   初始化

来自C ++ 0x草案,并不反映当前的C ++标准或许多C ++编译器的行为。

在当前的C ++标准中,该段落为:

  

如果控件在对象存在时重新输入声明(递归)   初始化后,行为未定义

答案 1 :(得分:2)

没有。但请注意,指向Blah的指针为static

  

6.7声明声明

     

4 [...]否则这样的对象就是   初始化第一次控制   通过其声明;这样   一个对象被认为是初始化的   完成后   初始化。如果初始化   通过抛出异常退出   初始化不完整,所以它   将在下次再次尝试   控制进入声明

答案 2 :(得分:0)

编辑:这与C ++ 0x草案有关。

引用标准(6.7-4):

  

如果控件同时进入声明   在初始化对象时,并发执行应等待初始化

的完成

据我了解,像这样的静态初始化是线程安全的。