2017-02-15 20 views
2
#include <pthread.h> 
#include <thread> 
#include <iostream> 

using namespace std; 

struct A 
{ 
    ~A() 
    { 
     cout << "~A()" << endl; 
    } 
}; 

void* f(void*) 
{ 
    thread_local A a; 
    return 0; 
} 

int main() 
{ 
    pthread_t tid; 
    pthread_create(&tid, nullptr, f, nullptr); 
    this_thread::sleep_for(5min); 
} 

根據cppreference「thread_local」是否適用於裸線?

線程開始時的對象被分配和 螺紋結束時釋放。每個線程都有自己的對象實例。只有 對象聲明thread_local有這個存儲時間。

我只是想知道:

如何C++編譯器創建和退出裸線程(,而不是std::thread)時,知道嗎?

換句話說:

是否裸線程函數f結束後的C++標準保證A::~A()會叫什麼名字?

+6

從C++標準的角度來看,這很難回答,因爲C++標準沒有使用它的方式的「裸線程」的概念。但是,當然C++線程將以特定於平臺的方式實現,如果您碰巧直接編寫相同的實現,最終可能會得到相同的行爲。 –

回答

4

C++標準沒有說明在撥打pthread_create時或之後會發生什麼。所以如果你想知道這些,你必須看看C++標準以外的其他地方。不幸的是,POSIX標準沒有提到C++線程本地對象。所以POSIX標準也不會說任何東西。

這意味着,除非特定編譯器,平臺或線程標準的文檔說明了特定的內容,否則無法保證在某個特定平臺上發生的任何事情都會發生。