小编典典

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

all

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

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

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

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

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

阅读 82

收藏
2022-06-10

共1个答案

小编典典

相关第 6.7 节:

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

然后是一个脚注:

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

所以,是的,你很安全。

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

2022-06-10