静态变量是自动线程局部的吗?
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
时,它还必须带有 extern
或 static
限定符,它传达了它的 链接 -- 外部或 none.
extern
在块范围内的任何类型的声明都是不寻常的,但它们偶尔会起到有用的作用。但是,大多数时候,static _Thread_local
是您想要的 thread-local、block-scope 变量。
局部 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
时,它还必须带有 extern
或 static
限定符,它传达了它的 链接 -- 外部或 none.
extern
在块范围内的任何类型的声明都是不寻常的,但它们偶尔会起到有用的作用。但是,大多数时候,static _Thread_local
是您想要的 thread-local、block-scope 变量。