thread_local变量初始化
thread_local variables initialization
我知道这是一个非常基本的问题,但我找不到简单的答案。
我正在编写一个程序,其中需要一些变量 thread_local
。据我了解,这意味着这些变量是 "like global variables" 但每个线程都有自己的副本。
我以这种方式将这些变量放在名为 Utilities.hpp
的头文件中名为 utils
的专用命名空间中:
// 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
其他变量 var2
和 vect1
.
也一样
我在 main.cpp
文件中的程序开头尝试将它们初始化为 class 的普通静态变量,如下所示:
int utils::var1;
int utils::var2;
std::vector<double> utils::vect1;
int main(int argc, const char * argv[]) {
return 0;
}
但是我得到的错误总是一样的。
我不明白如何初始化这种变量,我做错了什么?
根据评论...
声明和定义必须匹配。因此 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;
我知道这是一个非常基本的问题,但我找不到简单的答案。
我正在编写一个程序,其中需要一些变量 thread_local
。据我了解,这意味着这些变量是 "like global variables" 但每个线程都有自己的副本。
我以这种方式将这些变量放在名为 Utilities.hpp
的头文件中名为 utils
的专用命名空间中:
// 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
其他变量 var2
和 vect1
.
我在 main.cpp
文件中的程序开头尝试将它们初始化为 class 的普通静态变量,如下所示:
int utils::var1;
int utils::var2;
std::vector<double> utils::vect1;
int main(int argc, const char * argv[]) {
return 0;
}
但是我得到的错误总是一样的。
我不明白如何初始化这种变量,我做错了什么?
根据评论...
声明和定义必须匹配。因此 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;