静态变量是自动线程局部的吗?

Are static variables automatically thread local?

局部 static 变量是自动线程局部的,还是它们在线程之间共享?

void f() {
    static int x; // <-- need explicit _Thread_local ?
}

static_Thread_local 指定了两个不同的东西。

声明为 static 的变量具有 静态存储持续时间 并且具有完整的程序生命周期。 _Thread_local 声明的变量具有 线程存储持续时间 并且每个线程都存在一个实例。

它们是线程之间的共享值。正如您自己已经提到的那样,如果您想让每个线程都具有独立的价值,那么请将其声明为 _Thread_local static int x;

在 C 语言规范承认线程或对线程有任何支持之前,static 用于 block-scope 变量,更不用说 _Thread_local 了。在这种情况下,当不与 _Thread_local 组合时,它指定 静态存储持续时间 ,这意味着变量在程序执行开始时就存在(好像)并且存在并且在整个 运行 程序中保持其 last-stored 值。具有静态存储持续时间的对象由所有线程共享。

另一方面,_Thread_local总是指定线程存储持续时间,这意味着如此声明的对象存在并保持其last-stored值线程的整个生命周期,并且声明的标识符在每个线程中指定不同的对象。当一个对象在块范围内声明为 _Thread_local 时,它还必须带有 externstatic 限定符,它传达了它的 链接 -- 外部或 none.

extern 在块范围内的任何类型的声明都是不寻常的,但它们偶尔会起到有用的作用。但是,大多数时候,static _Thread_local 是您想要的 thread-local、block-scope 变量。