是否保证在销毁所有线程本地存储对象后销毁全局对象? #包括 使用名称空间std; 结构A { A(){} ~A(){} }; A g_A; int main() { 线程([]() { 螺纹A本地螺纹A tl螺纹A; 出口(0); }).detach(); } > > C++标准保证 gya 在代码> TLYA < /COD>被破坏后会被破坏吗?< /强> < P>是的,它是.

是否保证在销毁所有线程本地存储对象后销毁全局对象? #包括 使用名称空间std; 结构A { A(){} ~A(){} }; A g_A; int main() { 线程([]() { 螺纹A本地螺纹A tl螺纹A; 出口(0); }).detach(); } > > C++标准保证 gya 在代码> TLYA < /COD>被破坏后会被破坏吗?< /强> < P>是的,它是.,c++,multithreading,global-variables,standards,c++17,C++,Multithreading,Global Variables,Standards,C++17,语言规范中的[basic.start.term]部分说 使用静态存储初始化对象(即生命周期(3.8)已开始的对象)的析构函数(12.4) 从main返回的结果和调用std::exit(18.5)的结果调用duration。析构函数 对于在给定线程内具有线程存储持续时间的初始化对象,将作为返回的结果调用 从该线程的初始函数开始,并作为该线程调用std::exit的结果。完成 对线程存储持续时间在该线程内的所有初始化对象的析构函数进行排序 在启动具有静态存储持续时间的任何对象的析构函数之前 因此,线

语言规范中的[basic.start.term]部分说

使用静态存储初始化对象(即生命周期(3.8)已开始的对象)的析构函数(12.4) 从main返回的结果和调用std::exit(18.5)的结果调用duration。析构函数 对于在给定线程内具有线程存储持续时间的初始化对象,将作为返回的结果调用 从该线程的初始函数开始,并作为该线程调用std::exit的结果。完成 对线程存储持续时间在该线程内的所有初始化对象的析构函数进行排序 在启动具有静态存储持续时间的任何对象的析构函数之前


因此,线程局部变量将在静态(全局)变量之前被销毁。

您可以通过打印消息来检查它,而构造函数和析构函数..编译器输出不是标准的。不管输出是什么,我不确定它是否符合C++标准。为什么你不能自己检查标准?工作草案可以从各种来源免费获得PDF和HTML格式的文件。@T.C.标准文件对我来说太难阅读了。我的第一个信息来源是cppreference.com,它更具可读性。
#include <thread>

using namespace std;

struct A
{
    A() {}
    ~A() {}
};

A g_a;

int main()
{
    thread([]()
    {
         thread_local A tl_a;
         exit(0);
    }).detach();
}