Quiero hacer un registro de hilo en mi clase, así que decido agregar un cheque para la thread_local
función:
#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;
}
El código es simple. Mi Bar
clase tiene un thread_local
miembro estático foo
. Si thread_local
Foo foo
se crea una estática , significa que se crea un hilo.
Pero cuando ejecuto el código, no Foo()
aparece nada en las impresiones, y si elimino el comentario en Bar
el constructor, que utiliza foo
, el código funciona bien.
Probé esto en GCC (7.4.0) y Clang (6.0.0) y los resultados son los mismos. Supongo que el compilador descubrió que foo
no está en uso y no genera una instancia. Entonces
- ¿El compilador ignoró al
static thread_local
miembro? ¿Cómo puedo depurar esto? - Si es así, ¿por qué un
static
miembro normal no tiene este problema?
fuente
Encontré esta información en " Manejo de ELF para almacenamiento local de subprocesos " que puede probar la respuesta de @LF
fuente