Je veux faire un enregistrement de thread dans ma classe, donc je décide d'ajouter une vérification pour la thread_local
fonctionnalité:
#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 Bar
classe a un thread_local
membre statique foo
. Si une statique thread_local
Foo foo
est 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 Bar
le 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 foo
n'est pas utilisé et ne génère pas d'instance. Donc
- Le compilateur a-t-il ignoré le
static thread_local
membre? Comment puis-je déboguer pour cela? - Si oui, pourquoi un
static
membre normal n'a-t-il pas ce problème?
la source
J'ai trouvé ces informations dans " ELF Handling For Thread-Local Storage " qui peut prouver la réponse de @LF
la source