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

Is there any benefit of using static for thread_local variable?

根据这个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应该是没有意义的。那么对 thread_local 变量使用 static 有什么好处吗?比如做一些编译优化?

您引用的答案是关于 C++ 的,在 C++ 中,这两个声明似乎是相同的。但这在 C 中并非如此,并且由于您的问题同时带有 C 和 C++ 标签,因此不清楚您关心哪种语言。

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

In the declaration of an object with block scope, if the declaration specifiers include _Thread_local, they shall also include either static or extern. If _Thread_local appears in any declaration of an object, it shall be present in every declaration of that object.

所以这是声明变量的优点 static thread_local:它允许 C 编译,前提是您包含 threads.h 库头。

但是,它不会以任何方式影响两种语言的性能。