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

R S*_*hko 10 c++ thread-safety static-initializer c++11

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

void moo()
{
    static std::string cat("argent");  // not thread safe
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

jsp*_*cal 9

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

§6.7stmt.decl

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

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

  • 着名的遗言"应该很容易避免".在一般情况下非常难以避免. (3认同)