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

像这样。

struct some_struct { // Other fields ..... __thread int tl; } 

我试图这样做,但编译器给了我这个错误。

 ./cv.h:16:2: error: '__thread' is only allowed on variable declarations __thread int tl; 

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

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

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

gcc__thread的使用施加以下限制 :

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

多个编译器支持__thread修饰符。 从编译器到编译器的确切限制有所不同,这是不可想象的。

C11标准第6.7.1节第2段

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

C11标准第6.7.1节第3段

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

根据旧的Petzold书“Programming Windows”(第1241页),您可以使用关键字将变量标记为本地线程:__ declspec(thread)。 例如:__ declspec(thread)int iGlobal = 1;

我怀疑这可以在课堂上完成。 您也可以将变量设置为静态。 [编辑]刚刚意识到你可能没有在Windows上运行……所以我想对于任何需要Windows回答的人来说,这可能是相关的。

你应该改变__thread int tl; to thread_local static int tl;

对于C来说这没有多大意义, static (=全局)成员只是C ++的一个特性。 因此新的C11标准(引入_Thread_local )不允许它。 基本上允许这些野兽在一个变量中允许静态存储持续时间。

对于C ++,这在类中可能与static成员类似,但如果C ++ 11允许这样做,我不知道。