2017-04-15 160 views
1

我知道这是一个非常基本的问题,但我无法找到一个简单的答案。thread_local变量初始化

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

请给我们一个[最小,完全,可核查示例](https://stackoverflow.com/help/mcve)。具体来说,我们来看一个'.cpp'文件。 – einpoklum

+1

在声明*和*定义中需要'thread_local'。 –

+0

@ G.M。谢谢!如果你想发布它作为答案,我会设置这个问题解决 – jackscorrow

回答

1

根据意见...

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