Destruction d’objects thread_local

Dans la question Utilisation de QSqlQuery à partir de plusieurs threads , le stockage des threads résout le problème.

J’ai fait un code de démonstration simple pour être absolument clair sur le spécificateur thread_local C ++ 11. Le code ci-dessous crée deux threads dont l’object ThreadLocal est un object unique local. La fonction Storage :: get est un singleton spécifique à un thread. La norme garantit-elle que le destructeur ThreadLocal est appelé à la jointure ou à la sortie de la fonction de thread?

Compilé avec GCC 5.4.0 (g ++ -o main main.cpp –std = c ++ 11 -lpthread)

#include  #include  #include  #include  #include  #include  static std::mutex mtx; struct ThreadLocal { std::ssortingng name; ~ThreadLocal() { mtx.lock(); std::cout << "destroy " << name << std::endl; mtx.unlock(); } }; struct Storage { static ThreadLocal &get() { /* Thread local singleton */ static thread_local ThreadLocal l; static std::atomic cnt(0); l.name = std::to_ssortingng(cnt); cnt++; return l; } }; void thread() { mtx.lock(); std::cout << Storage::get().name << std::endl; mtx.unlock(); std::this_thread::sleep_for(std::chrono::seconds(1)); } int main(int argc, const char **argv) { std::thread t1(&thread); std::thread t2(&thread); t1.join(); t2.join(); } 

Si l’object a été construit, il sera détruit à la sortie de la fonction thread. Presque dans ces mots exacts à [basic.stc.thread] / 2 :

Une variable avec une durée de stockage de thread doit être initialisée avant sa première utilisation odr ([basic.def.odr]) et, si elle est construite, doit être détruite à la sortie du thread.