C 中经常争论的一个问题是局部静态变量初始化的线程安全性,例如以下代码:
Logger& g_logger() { static Logger lg; return lg; }
在 C 11 标准中,此类初始化的行为已经最终确定,现在保证它是线程安全的。标准第 6.7 节规定“此类变量在控制第一次通过其声明时被初始化”,并且“并发执行应等待初始化完成”。此外,实现脚注澄清了“实现不得在初始化程序的执行周围引入任何死锁。”
主要编译器(gcc 4.7、vc 2011 和 clang 3.0)已正确实现修订后的线程安全要求。这意味着即使存在并发线程,lg 变量的构造函数也只会执行一次。
请注意,此保证仅适用于初始化本身。后续通过引用访问变量不一定是线程安全的。
以上是C 11 局部静态变量初始化保证线程安全吗?的详细内容。更多信息请关注PHP中文网其他相关文章!