C 11:STD Ref Global变量和非功能 - 局部线程界初始化订单
C++11: std ref global variable and non-function-local thread_local initialization order?
在静态初始化阶段进入main之前,构建了C 11中的全局变量。
。同样在每线" thread_local初始化阶段"中构建了非函数 - 局部螺纹tread_local变量。
C 11标准是否应以什么顺序指定这些变量?在这两种情况下,如果有两个变量:
// global scope
A::A() { b.f(); } // A constructor uses global b
A a;
B b;
C 11标准是否应以什么顺序进行初始化,或者如果使用一个变量,则应产生错误?
?对于非功能 - 局部线程_local同样:
// global scope
A::A() { b.f(); } // A constructor uses global b
thread_local A a;
thread_local B b;
标准是否指定必须构造它们的顺序,并且是否定义了如果变量在初始化之前从另一个构造函数使用?
之前会发生什么?您可以提供 C 11标准参考以支持您提出的答案。
您的陈述,即在静态初始化阶段进入MAIN之前,构建了" C 11中的全局变量"。似乎不是完全正确的 - 在动态初始化阶段
之前可能不会初始化它们。对于带有"有序初始化"的变量,您的第一个A和B是,然后标准说
变量具有单一定义的有序初始化 翻译单元应按其顺序初始化 翻译单元中的定义。
3.6.2/2涵盖了所有这些。
编辑:据我所知,您的第二个A和B没有订购的初始化,并且可以按任何顺序初始化。但是我可能缺少一些东西。
对于静态存储持续时间,我同意艾伦的答案。如果初始化在同一翻译单元中,则它们的动态初始化是这些对象定义的顺序。如果可以弄清楚如何(每3.6.2/3),则允许编译器将b
初始化为静态初始化。因此,第一个程序可能会或可能不会调用未定义的行为,这可能是一个坏主意。
对于动态存储持续时间,注3.7.2/2:
应在第一次ODR使用(3.2)之前初始化带有线程存储持续时间的变量,如果构造,则应在线程出口上销毁。
因此,线程 - 本地变量的作用更像功能 - 本地静态变量,而不是命名空间静态变量。第二个程序没有不确定的行为。
- 线程局部变量的初始化顺序
- C++:用IIFE线程初始化静态局部变量安全吗
- 在 OpenMP 中重置线程局部变量
- 是局部unordered_map变量线程在C 中安全的线程
- 线程局部变量的初始化
- 如果两个线程调用同一个函数,但函数中的所有变量都是局部变量,我还需要担心线程之间共享数据吗?
- 是包含线程局部变量重入的函数
- 为什么静态局部变量的 MSVC 线程安全初始化使用 TLS
- 我们是否需要原子地递增线程局部变量
- 多线程galib247遗传算法陷入局部极大值
- 有没有更好的方法可以使此代码线程安全?线程局部静态似乎是一个生硬的工具
- 使用局部静态std :: ARNE_FLAG和局部静态指针对静态变量的线程安全初始化
- 如何在c++中初始化线程局部变量
- 模拟线程局部变量
- 作用域和线程局部变量如何在 (V8) C++中工作?
- 线程局部全局作用域变量
- 在运行循环外声明、分配和释放线程局部指针变量
- 如何定义线程局部的局部静态变量
- 通过非线程局部对象访问的线程局部变量
- 是否可以使用与非线程局部变量同名的线程局部变量