为thread_local变量使用static有什么好处吗?

时间:2017-05-23 01:59:36

标签: c++ static thread-local-storage

根据这个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有什么好处吗?比如做一些编译优化?

1 个答案:

答案 0 :(得分:2)

你引用的答案是关于C ++的,而在C ++中,似乎两个声明是相同的。但是在C中并不是这样,因为你的问题用C和C ++标签标记,所以你不清楚你关心哪种语言。

在C中,如果在函数内声明线程局部变量,则必须将其声明为staticextern(取决于它具有的链接)。见§6.7.1, paragraph 3

  

在具有块作用域的对象的声明中,如果声明说明符包含_Thread_local,则它们还应包括static或extern。如果_Thread_local出现在对象的任何声明中,它将出现在该对象的每个声明中。

所以这是声明变量static thread_local的一个优点:它允许C编译,只要你包含threads.h库头。

但是,它不会以任何方式影响任何一种语言的表现。