10

我知道从 C++03 标准开始,函数范围的静态初始化不能保证是线程安全的:

void moo()
{
    static std::string cat("argent");  // not thread safe
    ...
}

随着 C++0x 标准最终提供标准线程支持,函数范围的静态初始化是否需要线程安全?

4

1 回答 1

9

似乎初始化将是线程安全的,因为在对象在进入函数时动态初始化的情况下,它保证在关键部分执行:

§ 6.7 stmt.decl

4. ...这样的对象在控件第一次通过其声明时被初始化...如果控件在对象初始化时同时进入声明,则并发执行应等待初始化完成...

有一个潜在的边缘情况,如果从 main() 返回后,静态对象的析构函数在静态局部已经销毁后调用该函数,则行为未定义。但是,这应该很容易避免。

于 2010-01-01T02:09:57.553 回答