Ich möchte eine Thread-Registrierung in meiner Klasse durchführen, daher entscheide ich mich, eine Überprüfung für die thread_localFunktion hinzuzufügen :
#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;
}
Der Code ist einfach. Meine BarKlasse hat ein statisches thread_localMitglied foo. Wenn eine Statik thread_local Foo fooerstellt wird, bedeutet dies, dass ein Thread erstellt wird.
Aber wenn ich den Code ausführe, nichts in den Foo()Ausdrucken, und wenn ich den Kommentar im BarKonstruktor entferne , der verwendet foo, funktioniert der Code einwandfrei.
Ich habe dies auf GCC (7.4.0) und Clang (6.0.0) versucht und die Ergebnisse sind die gleichen. Ich vermute, dass der Compiler festgestellt hat, dass er foonicht verwendet wird und keine Instanz generiert. Damit
- Hat der Compiler das
static thread_localMitglied ignoriert ? Wie kann ich dafür debuggen? - Wenn ja, warum hat ein normales
staticMitglied dieses Problem nicht?