你可以在类或结构中使用线程局部变量吗?

pyt*_*nic 22 c c++ multithreading thread-local

像这样.

struct some_struct
{
 // Other fields
 .....
 __thread int tl;
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试这样做,但编译器给了我这个错误.

./cv.h:16:2: error: '__thread' is only allowed on variable declarations
        __thread int tl;
Run Code Online (Sandbox Code Playgroud)

Hri*_*iev 15

线程局部存储仅适用于静态变量.将非静态结构或类成员线程局部化是没有意义的.

本地(自动)变量始终特定于执行代码的线程,但全局和静态变量在线程之间共享,因为它们驻留在数据或BSS段中.TLS提供了一种机制,使这些全局变量成为线程的本地变量,这就是__thread关键字实现的目的 - 它指示编译器在每个线程中创建变量的单独副本,而词法上它仍然是全局变量(例如,它可以通过不同的方式访问)在同一执行线程内调用的函数).

非静态类成员和结构成员放置在分配对象(类或结构)的相同位置 - 如果声明了自动变量,则在堆栈中,或者在堆中使用newmalloc()使用.无论哪种方式,每个线程都会收到变量的唯一存储位置,并且__thread在这种情况下不适用,因此会出现编译器错误.

  • 我不同意 - 仅仅因为一个对象是由一个线程创建的,并不意味着它将仅由一个线程(例如无锁数据结构)操纵.不可否认,这是相对罕见的. (13认同)
  • 不是__thread或thread_local的当前含义,但是在某些情况下,为每个线程创建一个不同的成员是有意义的,在一些接口后面很好地包装. (9认同)

NPE*_*NPE 7

gcc对以下内容的使用施加以下限制__thread:

__thread说明符可以应用于类的任何全局,文件范围的静态,函数范围的静态或静态数据成员.它可能不适用于块范围的自动或非静态数据成员.

__thread改性剂由多个编译器的支持.从编译器到编译器的确切限制有所不同,这是不可想象的.


pho*_*xis 5

C11 标准第 6.7.1 节第 2 段

声明中的声明说明符中最多可以给出一个存储类说明符,但 _Thread_local 可以与 static 或 extern 一起出现。120)

C11 标准第 6.7.1 节第 3 段

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


Lin*_*gxi 5

你应该__thread int tl;改为thread_local static int tl;

  • 那么您就不能在该字段中拥有具有不同值的结构/类的多个实例。 (3认同)