在C ++ 11中本地静态variables初始化是线程安全的吗?
我知道这是一个经常被问到的问题,但是由于有很多变种,我想重新说明它,并希望有一个反映当前状态的答案。 就像是
Logger& g_logger() { static Logger lg; return lg; }
variableslg的构造函数保证只运行一次?
我从以前的答案中知道,在C ++ 03中,这不是; 在C ++ 0x草案中,这是强制执行的。 但我想要一个更清晰的答案
- 在C ++ 11标准(不是草案)中,线程安全的初始化行为是否已经完成?
- 如果以上是肯定的,那么在当前stream行编译器的最新版本中,即gcc 4.7,vc 2011和clang 3.0,它们是否被正确实现?
相关章节6.7:
第一次控制通过声明时,这样的variables被初始化; 这样的variables在初始化完成时被认为是初始化的。 […]如果控制在variables初始化的同时进入声明,则并发执行应等待初始化完成。
然后有一个脚注:
这个实现不能在执行初始化程序的时候引入任何死锁。
所以是的,你很安全。
(这当然没有说随后通过引用访问variables的情况。)
–fno-threadsafe-statics也值得一提。 在gcc中:
不要发出额外的代码来使用C ++ ABI中指定的用于本地静态线程安全初始化的例程。 您可以使用此选项在不需要线程安全的代码中稍微减less代码大小。
另外,看看旧的线程在GCC中的函数静态variables是线程安全的吗?