【发布时间】:2020-03-23 12:14:59
【问题描述】:
C.h:
#include <iostream>
class C {
public:
explicit C(int id) { std::cout<<"Initialized "<<id<<"\n"; }
};
1.cpp:
#include "C.h"
C global(1);
2.cpp:
#include "C.h"
thread_local C thread(2);
int main() {}
我的问题是:是否保证global 会在thread 之前初始化?
据我所知,C++ 标准在这一点上有些模糊。它说(来自 C++17 n4659 草案):
[basic.start.static] 静态初始化
具有静态存储持续时间的变量被初始化为 程序启动的结果。带线程存储的变量 持续时间被初始化为线程执行的结果。
按理说“程序启动”发生在“线程执行”之前,但由于这两个表达式都只出现在标准中的那个地方,我正在寻求实际语言律师的建议。
【问题讨论】:
-
IIRC 有标准的保证。但所有供应商在首次使用时都会初始化
thread_local变量。 -
"按理说“程序启动”发生在“线程执行”之前”我想这取决于“程序启动是什么"(并继续执行
main())本身是否是线程(在 C++ 术语中)。如果它是,那么人们可能期望完成的事情作为线程执行的结果发生在之前事情完成作为程序的结果启动. -
也相关:活跃CWG issue 2148。
标签: c++ c++17 language-lawyer undefined-behavior