Ich möchte eine Thread-Registrierung in meiner Klasse durchführen, daher entscheide ich mich, eine Überprüfung für die thread_local
Funktion 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 Bar
Klasse hat ein statisches thread_local
Mitglied foo
. Wenn eine Statik thread_local
Foo foo
erstellt 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 Bar
Konstruktor 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 foo
nicht verwendet wird und keine Instanz generiert. Damit
- Hat der Compiler das
static thread_local
Mitglied ignoriert ? Wie kann ich dafür debuggen? - Wenn ja, warum hat ein normales
static
Mitglied dieses Problem nicht?
quelle
Ich habe diese Informationen in " ELF-Handhabung für threadlokalen Speicher " gefunden, was die Antwort von @LF beweisen kann
quelle