在C ++ 11中本地静态variables初始化是线程安全的吗?

我知道这是一个经常被问到的问题,但是由于有很多变种,我想重新说明它,并希望有一个反映当前状态的答案。 就像是

Logger& g_logger() { static Logger lg; return lg; } 

variableslg的构造函数保证只运行一次?

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

  1. 在C ++ 11标准(不是草案)中,线程安全的初始化行为是否已经完成?
  2. 如果以上是肯定的,那么在当前stream行编译器的最新版本中,即gcc 4.7,vc 2011和clang 3.0,它们是否被正确实现?

相关章节6.7:

第一次控制通过声明时,这样的variables被初始化; 这样的variables在初始化完成时被认为是初始化的。 […]如果控制在variables初始化的同时进入声明,则并发执行应等待初始化完成。

然后有一个脚注:

这个实现不能在执行初始化程序的时候引入任何死锁。

所以是的,你很安全。

(这当然没有说随后通过引用访问variables的情况。)

–fno-threadsafe-statics也值得一提。 在gcc中:

不要发出额外的代码来使用C ++ ABI中指定的用于本地静态线程安全初始化的例程。 您可以使用此选项在不需要线程安全的代码中稍微减less代码大小。

另外,看看旧的线程在GCC中的函数静态variables是线程安全的吗?