C ++ 0x静态初始化和线程安全

时间:2010-01-01 01:40:57

标签: c++ thread-safety c++11 static-initializer

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

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

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

1 个答案:

答案 0 :(得分:9)

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

§ 6.7 stmt.decl

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

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