Chcę dokonać rejestracji wątku w mojej klasie, więc postanawiam dodać opcję dla tej thread_local
funkcji:
#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;
}
Kod jest prosty. Moja Bar
klasa ma statyczny thread_local
element foo
. Jeśli thread_local
Foo foo
tworzony jest statyczny , oznacza to, że tworzony jest wątek.
Ale kiedy uruchamiam kod, nic nie ma na Foo()
wydrukach, a jeśli usunę komentarz w Bar
konstruktorze, który używa foo
, kod działa poprawnie.
Próbowałem tego na GCC (7.4.0) i Clang (6.0.0) i wyniki są takie same. Wydaje mi się, że kompilator odkrył, że foo
jest nieużywany i nie generuje instancji. Więc
- Czy kompilator zignorował
static thread_local
członka? Jak mogę to debugować? - Jeśli tak, to dlaczego normalny
static
członek nie ma tego problemu?
źródło
Znalazłem te informacje w „ ELF Handling For Thread-Local Storage ”, który może potwierdzić odpowiedź @LF
źródło