C++11 中局部静态变量初始化是线程安全的吗? [重复]

问题描述 投票:0回答:2

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

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

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

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

  1. 在C++11标准(非草案)中,线程安全的初始化行为是否已最终确定?
  2. 如果上述情况是肯定的,那么在当前最新版本的流行编译器中,即 gcc 4.7、vc 2011 和 clang 3.0,它们是否正确实现?
c++ thread-safety c++11
2个回答
229
投票

相关第6.7节:

此类变量在控件第一次通过其声明时被初始化;这样的变量在初始化完成后就被认为已初始化。 [...] 如果在初始化变量时控制同时进入声明,则并发执行应等待初始化完成。

然后有一个脚注:

实现不得在初始化程序的执行周围引入任何死锁。

所以,是的,你很安全。

(当然,这并没有说明随后通过引用访问变量的情况。)


27
投票

-fno-threadsafe-statics
也值得一提。在海湾合作委员会:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.