关于c ++:C ++ 11中的本地静态变量初始化是否是线程安全的?

Is local static variable initialization thread-safe in C++11?

本问题已经有最佳答案,请猛点这里访问。

我知道这是一个经常被问到的问题,但是由于有很多变种,我想重新陈述它,并希望有一个反映当前状态的答案。类似的东西

1
2
3
4
Logger& g_logger() {
    static Logger lg;
    return lg;
}

变量lg的构造函数是否保证只运行一次?

我从前面的答案中知道,在C++ 03中,这不是;在C++ 0x草稿中,这是强制的。但是我想要一个更清楚的答案

  • 在C++ 11标准(未草稿)中,线程安全初始化行为是否已完成?
  • 如果以上是肯定的,那么在当前流行的编译器的最新版本中,即GCC4.7、VC 2011和Clang3.0,它们是否得到了正确的实现?

  • 相关第6.7节:

    such a variable is initialized the first time control passes through its declaration; such a variable is considered initialized upon the completion of its initialization. [...] If control enters the declaration concurrently while the variable is being initialized, the concurrent execution shall wait for completion of the initialization.

    还有一个脚注:

    The implementation must not introduce any deadlock around execution of the initializer.

    所以是的,你很安全。

    (这当然没有说明通过引用对变量的后续访问。)


    --FNO螺纹安全静力学也值得一提。在海湾合作委员会:

    Do not emit the extra code to use the routines specified in the C++ ABI for thread-safe initialization of local statics. You can use this option to reduce code size slightly in code that doesn't need to be thread-safe.

    还有,看看老线程是GCC中线程安全的函数静态变量吗?