Quero fazer algum registro de thread na minha turma, por isso decido adicionar uma verificação para o thread_local
recurso:
#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;
}
O código é simples. Minha Bar
classe tem um thread_local
membro estático foo
. Se uma estática thread_local
Foo foo
for criada, isso significa que uma thread é criada.
Mas quando executo o código, nada aparece nas Foo()
impressões e se eu remover o comentário no Bar
construtor de que usa foo
, o código funciona bem.
Eu tentei isso no GCC (7.4.0) e Clang (6.0.0) e os resultados são os mesmos. Eu acho que o compilador descobriu que foo
não é usado e não gera uma instância. assim
- O compilador ignorou o
static thread_local
membro? Como posso depurar para isso? - Em caso afirmativo, por que um
static
membro normal não tem esse problema?
fonte
Encontrei essas informações em " ELF Handling for Thread-Local Storage ", que pode provar a resposta da @LF
fonte