2017-03-29 6 views
1
#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은 파괴 된 후 tl_a이 파괴 된 후 C32 표준이 보장됩니까?모든 thread-local-storage 오브젝트가 파기 된 후에 글로벌 오브젝트가 파기되도록 보장되고 있습니까?

+0

생성자 및 소멸자가 출력되는 동안 메시지를 인쇄하여 확인할 수 있습니다 .. –

+0

컴파일러 출력이 표준이 아닙니다. 출력 결과가 무엇이든 관계없이 C++ 표준을 준수하는지 여부는 확실하지 않습니다. – xmllmx

+0

표준을 직접 확인할 수없는 이유는 무엇입니까? 작업 초안은 다양한 소스에서 PDF 및 HTML 형식으로 자유롭게 사용할 수 있습니다. –

답변

3

예.

섹션 [basic.start.term] 언어 사양 정적 저장 기간이 초기화 된 개체

소멸자 (12.4) (즉, (그 수명 3.8 개체) 시작)라고 말한다 main에서 돌아와 std :: exit (18.5)를 호출 한 결과로 반환됩니다. 지정된 스레드 내에서 스레드 저장 기간이있는 초기화 된 객체의 경우 은 해당 스레드의 초기 함수에서 을 반환하고 해당 스레드가 std :: exit를 호출 한 결과로 호출됩니다. 스레드 내에서 스레드 저장 기간을 갖는 모든 초기화 된 개체에 대한 소멸자의 완료 ( )는 정적 저장소 기간이있는 개체의 소멸자가 시작되기 전에 번 순서로 정렬됩니다.

그래서 스레드 로컬 변수는 정적 (전역) 변수보다 먼저 파괴됩니다.