如果我在全局范围内定义静态__thread
变量,它是否等同于常规的非静态全局变量?换句话说,如果它们都在全局范围内,则以下两个变量是否相等:
int regular_global_int;
static __thread int static_thread_local_int;
如果答案是否定的,我能否知道这两者之间的主要区别是什么?我应该何时使用哪一个?
答案 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。线程局部变量的访问方式不同,以提供线程本地存储。