像这样。
struct some_struct
{
// Other fields
.....
__thread int tl;
}
我正在尝试这样做,但是编译器给了我这个错误。
./cv.h:16:2: error: '__thread' is only allowed on variable declarations
__thread int tl;
最佳答案
在C和C++中,线程局部存储适用于静态变量或仅适用于具有外部链接的变量。
局部(自动)变量通常在堆栈上创建,因此特定于执行代码的线程,但是全局和静态变量在所有线程之间共享,因为它们位于数据或BSS段中。 TLS提供了一种使这些全局变量在线程本地的机制,这就是__thread
关键字所实现的-它指示编译器在每个线程中创建变量的单独拷贝,而按词法保留全局或静态变量(例如,它可以可以由在同一执行线程中调用的不同函数访问)。
非静态类成员和结构成员放置在分配对象(类或结构)的位置-如果声明了自动变量,则在堆栈上;如果使用new
或malloc()
,则在堆上。无论哪种方式,每个线程都会为该变量接收一个唯一的存储位置,并且__thread
仅在这种情况下不适用,因此会出现编译器错误。