thread_local变量初始化

thread_local variables initialization

我知道这是一个非常基本的问题,但我找不到简单的答案。

我正在编写一个程序,其中需要一些变量 thread_local。据我了解,这意味着这些变量是 "like global variables" 但每个线程都有自己的副本。

我以这种方式将这些变量放在名为 Utilities.hpp 的头文件中名为 utils 的专用命名空间中:

// Utilities.hpp
namespace utils {
    extern thread_local int var1;
    extern thread_local int var2;
    extern thread_local std::vector<double> vect1;
}

我使用了 extern 关键字以避免多重声明。 无论如何,当我尝试在同一个 namespace 内的 .cpp 文件中初始化这些变量时,如下所示:

// Utilities.cpp
namespace utils {
    int var1;
    int var2;
    std::vector<double> vect1;
}

我收到这个错误:

Non-thread-local declaration of 'var1' follows thread-local declaration

其他变量 var2vect1.

也一样

我在 main.cpp 文件中的程序开头尝试将它们初始化为 class 的普通静态变量,如下所示:

int utils::var1;
int utils::var2;
std::vector<double> utils::vect1;

int main(int argc, const char * argv[]) {

    return 0;
}

但是我得到的错误总是一样的。

我不明白如何初始化这种变量,我做错了什么?

根据评论...

声明和定义必须匹配。因此 thread_local 存储限定符需要在两者中。所以你需要...

// Utilities.hpp
namespace utils {
  extern thread_local int var1;
  extern thread_local int var2;
  extern thread_local std::vector<double> vect1;
}

和...

// main.cpp
thread_local int utils::var1;
thread_local int utils::var2;
thread_local std::vector<double> utils::vect1;