非静态全局变量与全局静态__thread变量

时间:2014-11-16 22:17:15

标签: c++ multithreading gcc thread-local

如果我在全局范围内定义静态__thread变量,它是否等同于常规的非静态全局变量?换句话说,如果它们都在全局范围内,则以下两个变量是否相等:

int regular_global_int;
static __thread int static_thread_local_int;

如果答案是否定的,我能否知道这两者之间的主要区别是什么?我应该何时使用哪一个?

2 个答案:

答案 0 :(得分:3)

全局变量(更常见的是命名空间范围变量)在未使用存储类说明符声明时自动具有静态存储持续时间。在命名空间范围内,static并不意味着"静态存储持续时间&#34 ;;这意味着变量具有内部链接。因此

int x;
static int x;
在命名空间范围内的

都声明x具有静态存储持续时间,但是这两个声明与第一个声明给出x外部链接不同,但第二个声明给它内部链接。

在你写的情况下

static thread_local int x;

thread_local存储类说明符导致x具有线程本地存储持续时间(而不是静态存储持续时间),而static本身在命名空间范围内再次具有其通常含义。所以x是线程本地的它具有内部链接。

答案 1 :(得分:1)

我编译了

int regular_global_int;
__thread int static_thread_local_int;
int main()
{
 regular_global_int = 1;
 static_thread_local_int = 1;
}

at http://ellcc.org/blog/?page_id=340我不得不取消静态以防止优化器摆脱静态变量。我得到了

main:                                   # @main
# BB#0:                                 # %entry
    movl    $1, regular_global_int(%rip)
    movl    $1, %fs:static_thread_local_int@TPOFF
    xorl    %eax, %eax
    retq

表示x86_64。线程局部变量的访问方式不同,以提供线程本地存储。