【问题标题】:thread_local variables initializationthread_local 变量初始化
【发布时间】:2017-09-11 11:53:52
【问题描述】:

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

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

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

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

【问题讨论】:

  • 请告诉我们Minimal, Complete, Verifiable Example。具体来说,让我们看一个.cpp 文件。
  • 在声明定义中都需要thread_local
  • @G.M.谢谢!如果您想将其发布为答案,我会将这个问题设置为已解决

标签: c++ c++11 initialization thread-local


【解决方案1】:

根据 cmets...

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

【讨论】:

    猜你喜欢
    • 2014-08-06
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 2019-02-27
    • 2016-11-02
    • 2014-12-20
    • 1970-01-01
    • 2019-05-17
    相关资源
    最近更新 更多