Я хочу выполнить регистрацию потока в своем классе, поэтому я решил добавить проверку для функции thread_local
:
#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;
}
Код прост. В моем классе Bar
есть статический член thread_local
foo
. Если создается статический thread_local
Foo foo
, это означает, что создается поток.
Но когда я запускаю код, в Foo()
ничего не печатается, и если я удалю комментарий в конструкторе Bar
, который использует foo
, код работает нормально.
Я попробовал это на GCC (7.4.0) и Clang (6.0.0), и результаты такие же. Я предполагаю, что компилятор обнаружил, что foo
не используется, и не генерирует экземпляр. Так
- Компилятор проигнорировал элемент
static thread_local
? Как я могу отладить это? - Если да, то почему у обычного члена
static
нет этой проблемы?