#include <thread>
using namespace std;
struct A
{
A() {}
~A() {}
};
A g_a;
int main()
{
thread([]()
{
thread_local A tl_a;
exit(0);
}).detach();
}
C++标准保证g_a
在tl_a
被销毁后会被销毁吗?
是的,确实如此。
语言规范中的 [basic.start.term] 部分说
具有静态存储的初始化对象(即生存期 (3.8( 已开始的对象(的析构函数 (12.4( 持续时间是由于从主返回和调用 std::exit (18.5( 的结果而调用的。析 构 函数 对于在给定线程内具有线程存储持续时间的初始化对象,由于返回 从该线程的初始函数以及该线程调用 std::exit 的结果。竣工情况 对线程内线程存储持续时间的所有初始化对象的析构函数进行排序 在启动具有静态存储持续时间的任何对象的析构函数之前。
因此,线程局部变量将在静态(全局(变量之前被销毁。