我知道这是一个经常被问到的问题,但由于有这么多变体,我想重申一下,希望能有一个反映当前状态的答案。就像这样
Logger& g_logger() {
static Logger lg;
return lg;
}
变量lg的构造函数保证只运行一次吗?
我从前面的回答中知道,在C++03中,这不是;在C++0x草案中,这是强制的。但我想要一个更清晰的答案
发布于 2011-11-12 10:39:23
相关的第6.7条:
这样的变量在控件第一次通过其声明时被初始化;这样的变量在完成初始化时被认为是初始化的。..。如果控制在变量初始化时并发进入声明,则并发执行应等待初始化完成。
然后有一个脚注:
实现不能在初始值设定项的执行过程中引入任何死锁。
所以,是的,你很安全。
(当然,这并没有说明后续通过引用访问变量。)
发布于 2016-01-29 17:09:18
--fno-threadsafe-statics也值得一提。在《gcc》中:
不会发出额外的代码来使用C++ ABI中指定的例程进行本地静态的线程安全初始化。您可以使用此选项在不需要是线程安全的代码中略微减小代码大小。
另外,请看一下旧的线程Are function static variables thread-safe in GCC?
https://stackoverflow.com/questions/8102125
复制相似问题