我想在我的课程中做一些线程注册,所以我决定为该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会员没有这个问题?