Je veux faire un enregistrement de thread dans ma classe, donc je décide d'ajouter une vérification pour la thread_localfonctionnalité:
#include <iostream>
#include <thread>
class Foo {
public:
Foo() {
std::cout << "Foo()" << std::endl;
}
~Foo() {
std::cout << "~Foo()" << std::endl;
}
};
class Bar {
public:
Bar() {
std::cout << "Bar()" << std::endl;
//foo;
}
~Bar() {
std::cout << "~Bar()" << std::endl;
}
private:
static thread_local Foo foo;
};
thread_local Foo Bar::foo;
void worker() {
{
std::cout << "enter block" << std::endl;
Bar bar1;
Bar bar2;
std::cout << "exit block" << std::endl;
}
}
int main() {
std::thread t1(worker);
std::thread t2(worker);
t1.join();
t2.join();
std::cout << "thread died" << std::endl;
}
Le code est simple. Ma Barclasse a un thread_localmembre statique foo. Si une statique thread_local Foo fooest créée, cela signifie qu'un thread est créé.
Mais lorsque j'exécute le code, rien dans les Foo()impressions, et si je supprime le commentaire dans Barle constructeur de, qui utilise foo, le code fonctionne correctement.
J'ai essayé cela sur GCC (7.4.0) et Clang (6.0.0) et les résultats sont les mêmes. Je suppose que le compilateur a découvert qu'il foon'est pas utilisé et ne génère pas d'instance. Donc
- Le compilateur a-t-il ignoré le
static thread_localmembre? Comment puis-je déboguer pour cela? - Si oui, pourquoi un
staticmembre normal n'a-t-il pas ce problème?