在所有线程局部存储对象被破坏后,是否保证全局对象被破坏?

时间:2017-03-29 03:40:08

标签: c++ multithreading global-variables standards c++17

#include <thread>

using namespace std;

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

A g_a;

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

g_a被破坏后,C ++标准保证tl_a是否会被破坏?

1 个答案:

答案 0 :(得分:3)

是的。

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

  

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

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