对 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 中,如果您在函数内声明一个线程局部变量,则必须将其声明为 static
或 extern
(取决于它具有的链接)。见 §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
库头。
但是,它不会以任何方式影响两种语言的性能。
根据这个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 中,如果您在函数内声明一个线程局部变量,则必须将其声明为 static
或 extern
(取决于它具有的链接)。见 §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
库头。
但是,它不会以任何方式影响两种语言的性能。