线程本地存储

可以使用 thread_local 关键字创建线程本地存储。用 thread_local 说明符声明的变量据说具有线程存储持续时间。

  • 程序中的每个线程都有自己的每个线程局部变量的副本。
  • 具有函数(本地)作用域的线程局部变量将在控件第一次通过其定义时初始化。除非声明 extern,否则这样的变量是隐式静态的。
  • 具有名称空间或类(非本地)作用域的线程局部变量将作为线程启动的一部分进行初始化。
  • 线程终止时销毁线程局部变量。
  • 如果类的成员是静态的,则它只能是线程本地的。因此,每个线程将有一个该变量的副本,而不是每个(线程,实例)对一个副本。

例:

void debug_counter() {
    thread_local int count = 0;
    Logger::log("This function has been called %d times by this thread", ++count);
}