Я хочу сделать некоторую регистрацию потока в моем классе, поэтому я решил добавить проверку для этой 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
члена нет этой проблемы?
источник
Я нашел эту информацию в " Обработка ELF для локального хранилища потоков ", которая может доказать ответ @LF
источник