Quiero hacer un registro de hilo en mi clase, así que decido agregar un cheque para la thread_localfunció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 Barclase tiene un thread_localmiembro estático foo. Si thread_local Foo foose 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 Barel 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 foono está en uso y no genera una instancia. Entonces
- ¿El compilador ignoró al 
static thread_localmiembro? ¿Cómo puedo depurar esto? - Si es así, ¿por qué un 
staticmiembro 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