我知道这是一个经常被问到的问题,但由于有很多变体,我想重新陈述一下,并希望有一个反映当前状态的答案。类似的东西
Logger& g_logger() {
static Logger lg;
return lg;
}
变量lg的构造函数是否保证只运行一次?
我从之前的答案中知道,在 C++03 中,这不是;在 C++0x 草案中,这是强制执行的。但我想要一个更明确的答案
相关第6.7节:
此类变量在控件第一次通过其声明时被初始化;这样的变量在初始化完成后就被认为已初始化。 [...] 如果在初始化变量时控制同时进入声明,则并发执行应等待初始化完成。
然后有一个脚注:
实现不得在初始化程序的执行周围引入任何死锁。
所以,是的,你很安全。
(当然,这并没有说明随后通过引用访问变量的情况。)
-fno-threadsafe-statics
也值得一提。在海湾合作委员会:
不要发出额外的代码来使用 C++ ABI 中指定的例程来进行本地静态的线程安全初始化。您可以使用此选项在不需要线程安全的代码中稍微减少代码大小。
另外,看看旧线程函数静态变量在GCC中是线程安全的吗?