首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >局部静态变量初始化在C++11中是线程安全的吗?

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

Stack Overflow用户
提问于 2011-11-12 10:34:55
回答 2查看 73K关注 0票数 223

我知道这是一个经常被问到的问题,但由于有这么多变体,我想重申一下,希望能有一个反映当前状态的答案。就像这样

代码语言:javascript
复制
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中,是否正确实现了?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-12 10:39:23

相关的第6.7条:

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

然后有一个脚注:

实现不能在初始值设定项的执行过程中引入任何死锁。

所以,是的,你很安全。

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

票数 203
EN

Stack Overflow用户

发布于 2016-01-29 17:09:18

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

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

另外,请看一下旧的线程Are function static variables thread-safe in GCC?

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8102125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档