thread
Microsoft 专用
该 线程 扩展的存储类修饰符用于声明线程本地变量。
__declspec( thread ) declarator
备注
线程本地 (TLS)存储 (tls) 是在多线程的每个线程进程分配线程特定数据的存储机制。在标准多线程程序中,数据在给定的所有线程都被进程共享,因此,而线程本地存储 (tls) 是分配的基于线程的数据结构。有关线程的完整讨论,请参见 多线程处理。
线程本地变量的声明必须使用 扩展属性语法 和 __declspec 关键字与 线程 关键字。例如,以下代码声明了一个整数线程局部变量,并用一个值对其进行初始化:
__declspec( thread ) int tls_i = 1;
必须遵循这些准则,在声明线程本地对象和变量时:
您可以只将 线程 没有成员函数的特性应用于数据声明和定义和类; 线程 函数声明或定义不能使用。
使用 线程 属性会影响 DLL 导入**.**延迟加载
您使用静态存储持续时间的数据项只能指定 线程 属性。这包括全局数据对象 ( 静态 和 extern),本地静态对象和类的静态数据成员。不能声明与 线程 属性的自动数据对象。
必须为声明和线程本地对象的定义使用 线程 属性,声明和定义是否在同一文件或单独的文件发生。
不能使用 线程 属性为类型修饰符。
使用 __declspec (线程),只有 POD 类无法实例化。为类声明的一部分,,因此,如果对象不声明线程属性将被忽略。例如:
// declspec_thread.cpp // compile with: /LD __declspec(thread) class X { public: int I; } x; // x is a thread object X y; // y is not a thread object
由于使用 线程 属性对象的声明允许,这两个示例在语义上是等效的:
// declspec_thread_2.cpp // compile with: /LD __declspec( thread ) class B { public: int data; } BObject; // BObject declared thread local. class B2 { public: int data; }; __declspec( thread ) B2 BObject2; // BObject2 declared thread local.
标准 C 允许使用需要引用的表达式的一只有对象的初始化或变量自身,但是,非静态绑定对象的。虽然 C++ 通常允许一个动态初始化对象涉及引用自身的表达式,这种初始化不允许使用线程本地对象。例如:
// declspec_thread_3.cpp // compile with: /LD #define Thread __declspec( thread ) int j = j; // Okay in C++; C error Thread int tls_i = sizeof( tls_i ); // Okay in C and C++
请注意包括初始化对象的 sizeof 表达式在 C 和 C++ 不构成引用自身并允许。
特定于 Microsoft 的结尾