thread_local变量的初始化

3

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

我正在编写一个程序,其中需要一些变量是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;
}

我使用了 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文件中将它们初始化为普通静态变量,像这样:

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

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

    return 0;
}

但我一直得到相同的错误。

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


1
请向我们展示一个最小、完整、可验证的示例。具体来说,请提供一个.cpp文件。 - einpoklum
2
你需要在声明和定义中都使用 thread_local - G.M.
@G.M. 谢谢!如果您想将其发布为答案,我会将此问题标记为已解决。 - jackscorrow
1个回答

5

根据评论所述...

声明和定义必须匹配。因此,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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接