Ral*_*ang 198 c++ thread-safety c++11
我知道这是一个经常被问到的问题,但由于有很多变种,我想重新陈述它,并希望有一个反映当前状态的答案.就像是
Logger& g_logger() {
static Logger lg;
return lg;
}
Run Code Online (Sandbox Code Playgroud)
变量lg的构造函数是否保证只运行一次?
我从以前的答案中知道,在C++ 03中,这不是; 在C++ 0x草案中,这是强制执行的.但我想要一个更明确的答案
Ker*_* SB 176
有关第6.7节:
第一次控制通过其声明时初始化这样的变量; 这样的变量在初始化完成后被认为是初始化的.[...]如果控件在初始化变量时同时进入声明,则并发执行应等待初始化完成.
然后有一个脚注:
实现不得在执行初始化程序时引入任何死锁.
所以,是的,你很安全.
(这当然没有说明通过引用随后访问变量.)
Den*_*tov 15
--fno-threadsafe-statics也值得一提.在gcc中:
不要发出额外的代码来使用C++ ABI中指定的例程来进行本地静态的线程安全初始化.您可以使用此选项在不需要线程安全的代码中略微减小代码大小.
另外,看一下旧线程Are函数静态变量是否在GCC中是线程安全的?