Я хочу зробити деяку реєстрацію потоків у своєму класі, тому я вирішую додати чек на цю 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
конструкторі 's, який використовує foo
, код працює нормально.
Я спробував це на GCC (7.4.0) та Clang (6.0.0), і результати однакові. Я думаю, що компілятор виявив, що foo
він не використовується, і не створює екземпляр. Тому
- Чи компілятор ігнорував
static thread_local
учасника? Як я можу налагодити це? - Якщо так, то чому нормальний
static
член не має цієї проблеми?