是否保证在销毁所有线程本地存储对象后销毁全局对象

Are global objects guaranteed to be destructed after all thread-local-storage objects are destructed?

本文关键字:对象 存储 全局 是否 线程      更新时间:2023-10-16
#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_atl_a被销毁后会被销毁吗?

是的,确实如此。

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

具有静态存储的初始化对象(即生存期 (3.8( 已开始的对象(的析构函数 (12.4( 持续时间是由于从主返回和调用 std::exit (18.5( 的结果而调用的。析 构 函数 对于在给定线程内具有线程存储持续时间的初始化对象,由于返回 从该线程的初始函数以及该线程调用 std::exit 的结果。竣工情况 对线程内线程存储持续时间的所有初始化对象的析构函数进行排序 在启动具有静态存储持续时间的任何对象的析构函数之前。

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