2017-02-15 2 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); 
} 

Nach cppreference:Funktioniert "thread_local" für einen nackten Thread?

Das Objekt zugeordnet wird, wenn der Faden beginnt, und freigegeben, wenn der Faden endet. Jeder Thread hat seine eigene Instanz des Objekts. Nur Objekte deklariert thread_local haben diese Speicherdauer.

Ich frage mich nur:

Wie funktioniert die C++ Compiler wissen, wann ein nackter Faden (statt std::thread) erstellt und beendet?

Mit anderen Worten:

Hat der C++ Standardgarantie A::~A() wird, nachdem die Funktion nackt Thread aufgerufen werden f fertig ist?

+6

Dies ist aus C++ - Standard Sicht schwer zu beantworten, da der C++ - Standard kein Konzept eines "nackten Threads" wie Sie es verwenden. Aber natürlich werden C++ - Threads plattformspezifisch implementiert, und wenn Sie die gleiche Implementierung direkt programmieren, können Sie wahrscheinlich das gleiche Verhalten erhalten. –

Antwort

4

Der C++ - Standard sagt nichts darüber aus, was passiert, wenn oder nachdem Sie pthread_create anrufen. Wenn Sie also etwas darüber wissen möchten, müssen Sie anders als im C++ - Standard suchen. Leider sagt der POSIX-Standard nichts über lokale C++ - Thread-Objekte aus. Der POSIX-Standard wird also auch nichts sagen.

Das bedeutet, dass alles, was auf einer bestimmten Plattform passiert, nicht garantiert wird, es sei denn, die Dokumentation für diesen bestimmten Compiler, Plattform oder Threading-Standard sagt etwas Bestimmtes.

Verwandte Themen