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

Selon cppreference:Est-ce que "thread_local" fonctionne pour un thread nu?

L'objet est attribué lorsque le fil commence et quand désallouée la fin de fil. Chaque thread a sa propre instance de l'objet. Seuls les objets déclarés thread_local ont cette durée de stockage.

Je me demande:

Comment le compilateur C++ savoir quand un fil nu (plutôt que std::thread) est créé et est sorti?

En d'autres termes:

Est-ce que la garantie C standard de A::~A() sera appelée après la fonction de fil nu f est terminé?

+6

Il est difficile de répondre d'un point de vue standard C++, puisque la norme C++ n'a pas le concept de "fil nu" comme vous l'utilisez. Mais bien sûr, les threads C++ seront implémentés de manière spécifique à la plate-forme, et s'il vous arrive de coder directement cette même implémentation, vous risquez d'obtenir le même comportement. –

Répondre

4

La norme C++ ne dit rien de ce qui se passe quand ou après avoir appelé pthread_create. Donc, si vous voulez savoir à ce sujet, vous devez regarder ailleurs que la norme C++. Malheureusement, la norme POSIX ne dit rien sur les objets locaux de thread C++. Donc, la norme POSIX ne dira rien non plus. Cela signifie que tout ce qui arrive sur une plate-forme particulière n'est pas garanti, à moins que la documentation de ce compilateur, de cette plate-forme ou de cette norme de thread ne précise quelque chose de spécifique.