【问题标题】:Is there any benefit of using static for thread_local variable?对 thread_local 变量使用静态有什么好处吗?
【发布时间】:2017-05-23 01:59:36
【问题描述】:

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

【问题讨论】:

  • 提高可读性?

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


【解决方案1】:

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

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

在块范围对象的声明中,如果声明说明符包含 _Thread_local,则它们还应包含 static 或 extern。如果 _Thread_local 出现在对象的任何声明中,它应该出现在该对象的每个声明中。

因此,这是声明变量 static thread_local 的一个优势:它允许 C 编译,前提是您包含 threads.h 库头。

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

【讨论】:

  • vector&lt;int&gt; 是 C 的语法错误,所以我把 C 标签去掉了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 2011-01-27
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多