Chcę dokonać rejestracji wątku w mojej klasie, więc postanawiam dodać opcję dla tej thread_localfunkcji:
#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 Barklasa ma statyczny thread_localelement foo. Jeśli thread_local Foo footworzony 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 Barkonstruktorze, 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 foojest nieużywany i nie generuje instancji. Więc
- Czy kompilator zignorował
static thread_localczłonka? Jak mogę to debugować? - Jeśli tak, to dlaczego normalny
staticczłonek nie ma tego problemu?