假设:
void getBlah() {
static Blah* blah = new Blah();
return blah;
}
在多线程设置中,是否可能多次调用新的Blah()?
谢谢!
答案 0 :(得分:4)
C ++标准不保证静态初始化的线程安全性 - 您应该将静态初始化视为需要显式同步。
Alexander Gessler的话:
如果控制进入声明 在对象存在的同时 初始化,并发执行 等待完成 初始化
来自C ++ 0x草案,并不反映当前的C ++标准或许多C ++编译器的行为。
在当前的C ++标准中,该段落为:
如果控件在对象存在时重新输入声明(递归) 初始化后,行为未定义
答案 1 :(得分:2)
没有。但请注意,指向Blah
的指针为static
。
6.7声明声明
4 [...]否则这样的对象就是 初始化第一次控制 通过其声明;这样 一个对象被认为是初始化的 完成后 初始化。如果初始化 通过抛出异常退出 初始化不完整,所以它 将在下次再次尝试 控制进入声明
答案 2 :(得分:0)
编辑:这与C ++ 0x草案有关。
引用标准(6.7-4):
如果控件同时进入声明 在初始化对象时,并发执行应等待初始化
的完成
据我了解,像这样的静态初始化是线程安全的。