2017-04-15 157 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;