猿问

本地静态变量初始化线程在C+11中是否安全?

本地静态变量初始化线程在C+11中是否安全?

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

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中,它们是否得到了适当的实现?


大话西游666
浏览 613回答 2
2回答

慕姐8265434

有关的第6.7节:此类变量在控件第一次通过其声明时被初始化;该变量在初始化完成后被视为初始化。[.]如果在初始化变量时控件同时输入声明,则并发执行应等待初始化完成。还有一个脚注:实现不能在初始化器的执行过程中引入任何死锁。所以是的,你很安全。(当然,这与随后通过引用访问变量无关。)

智慧大石

-FNO-线程安全静力学也值得一提.GCC:不要发出额外的代码来使用C+ABI中指定的例程来进行本地静力学的线程安全初始化。您可以使用此选项在不需要线程安全的代码中稍微减少代码大小。另外,看看这条旧线。GCC的函数静态变量线程安全吗?
随时随地看视频慕课网APP
我要回答