【发布时间】:2011-09-27 10:47:48
【问题描述】:
我知道 gcc 和 llvm-clang 会发出代码以线程安全的方式初始化局部静态变量(这允许人们通过在函数中包装全局静态来逃避静态顺序初始化失败)。
然而,This msdn blog post 是我能找到的关于 vcc 在这些情况下的行为的最佳文档,并且声称静态初始化永远不可能是线程安全的,因为本地静态的初始化程序可以递归地调用相同的范围。
我不赞成这个论点 - 如果初始化程序依赖于它自己的结果,这显然是一个编程错误。
因此,鉴于这篇文章是 2004 年的,gcc 和 clang 可以做到,而 the current msvc documentation 是模棱两可的(声明“分配”给本地静态不是线程安全的,仅此而已):
本地静态的初始化现在在 MSVC 中是线程安全的吗?
如果没有,为什么不呢,因为 gcc 显然可以做到这一点,但程序员之后很难添加。
【问题讨论】:
-
由于 C++03 不需要此时的线程安全,因此两个编译器在执行它们的操作时都一样正确。找出答案的唯一方法是查看生成的代码。可能它甚至取决于编译器标志(当你想要单线程代码时,gcc 肯定会让你禁用使用的互斥锁)
-
@PlasmaHH 也许,但您希望它出现在文档中 - 这是一个非常有用的功能!
-
至少在 gcc 手册页中是这样。不知道(也不太在意)MSVC。
标签: c++ visual-c++ thread-safety