根据这个comment,我可以看到定义
void f() {
thread_local vector<int> V;
V.clear();
... // use V as a temporary variable
}
相当于
void f() {
static thread_local vector<int> V;
V.clear();
... // use V as a temporary variable
}
但是我发现在一些开源项目中使用了类似代码:
void f() {
static thread_local vector<int> V;
......
}
根据我的理解,在这里添加static
应该毫无意义。那么对static
变量使用thread_local
有什么好处吗?比如做一些编译优化?
答案 0 :(得分:2)
你引用的答案是关于C ++的,而在C ++中,似乎两个声明是相同的。但是在C中并不是这样,因为你的问题用C和C ++标签标记,所以你不清楚你关心哪种语言。
在C中,如果在函数内声明线程局部变量,则必须将其声明为static
或extern
(取决于它具有的链接)。见§6.7.1, paragraph 3:
在具有块作用域的对象的声明中,如果声明说明符包含_Thread_local,则它们还应包括static或extern。如果_Thread_local出现在对象的任何声明中,它将出现在该对象的每个声明中。
所以这是声明变量static thread_local
的一个优点:它允许C编译,只要你包含threads.h
库头。
但是,它不会以任何方式影响任何一种语言的表现。