#include <cstdlib>
#include <thread>
#include <chrono>
#include <iostream>
using namespace std;
using namespace std::literals;
struct A
{
int n_ = 0;
A(int n) : n_(n) { cout << "A:" << n_ << endl; }
~A() { cout << "~A:" << n_ << endl; }
};
A a1(1);
int main()
{
std::thread([]()
{
static A a2(2);
thread_local A a3(3);
std::this_thread::sleep_for(24h);
}).detach();
static A a4(4);
thread_local A a5(5);
std::this_thread::sleep_for(1s);
std::exit(0);
}
제 컴파일러는 clang 5.0
과 -std=c++1z
입니다. 다음`std :: exit`가 소멸자를 예상대로 트리거하지 않는 이유는 무엇입니까?
출력은 : A a3
가 파괴되지 않은 개체를 의미하며 ~A:3
가없고
A:1 A:2 A:4 A:5 A:3 ~A:5 ~A:2 ~A:4 ~A:1
참고있다. cppref에 따른 그러나
:
std::exit
발생하는 통상 프로그램을 종료시킨다. 몇 가지 정리 단계는 입니다.스레드 로컬 저장 기간을 가진 개체의 소멸자는 ... 이 호출되도록 보장됩니다.
당신이 그것을 분리했기 때문에, 나는 생각한다. – SingerOfTheFall
이것은 http://stackoverflow.com/questions/19744250/what-happens-to-a-detached-thread-when-main-exits의 복제본입니까? –
아니요 스레드가 분리되지 않은 경우에도 마찬가지입니다. – xmllmx