thread_local变量初始化

jac*_*row 3 c++ initialization thread-local c++11

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

我正在编写一个程序,其中需要一些变量thread_local。根据我的理解,这意味着这些变量“像全局变量”,但每个线程都有自己的副本。

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

// Utilities.hpp
namespace utils {
    extern thread_local int var1;
    extern thread_local int var2;
    extern thread_local std::vector<double> vect1;
}
Run Code Online (Sandbox Code Playgroud)

我使用extern关键字是为了避免多重声明。无论如何,当我尝试像这样初始化.cpp文件中的这些变量时namespace

// Utilities.cpp
namespace utils {
    int var1;
    int var2;
    std::vector<double> vect1;
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Non-thread-local declaration of 'var1' follows thread-local declaration
Run Code Online (Sandbox Code Playgroud)

var2对于其他所有变量也是如此vect1

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

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

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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但我得到的错误总是相同的。

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

G.M*_*.M. 6

根据评论...

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

// Utilities.hpp
namespace utils {
  extern thread_local int var1;
  extern thread_local int var2;
  extern thread_local std::vector<double> vect1;
}
Run Code Online (Sandbox Code Playgroud)

和...

// main.cpp
thread_local int utils::var1;
thread_local int utils::var2;
thread_local std::vector<double> utils::vect1;
Run Code Online (Sandbox Code Playgroud)