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 的结尾

请参见

参考

__declspec

C++关键字

概念

线程本地存储 (TLS)