线程

Microsoft 专用

thread 扩展存储类修饰符用于声明线程局部变量。

__declspec( thread ) declarator

备注

线程本地存储 (TLS) 是多线程进程中的每个线程为线程特定的数据分配存储时所采用的机制。 在标准多线程程序中,数据在给定进程的所有线程间共享,而线程本地存储是用于分配每个线程数据的机制。 有关线程的完整讨论,请参阅多线程

线程局部变量的声明必须将扩展的特性语法与 __declspec 关键字和 thread 关键字一起使用。 例如,以下代码声明了一个整数线程局部变量,并用一个值对其进行初始化:

__declspec( thread ) int tls_i = 1;

在声明线程局部对象和变量时必须遵守下列准则:

  • 您可以只将 thread 特性应用于数据声明和定义以及不包含成员函数的类;thread 不能用于函数声明或定义。

  • 使用 thread 特性可能会影响 DLL 导入的延迟加载

  • 只能在具有静态存储持续时间的数据项上指定 thread 特性。 这包括全局数据对象(static 和 extern)、本地静态对象和类的静态数据成员。 不能声明带 thread 特性的自动数据对象。

  • 必须为线程本地对象的声明和定义使用 thread 特性,无论声明和定义是在同一文件中还是单独的文件中发生。

  • 无法将 thread 特性用作类型修饰符。

  • 仅可使用 __declspec(thread) 实例化 POD 类。 如果未将任何对象声明为类声明的一部分,则 thread 特性将被忽略。 例如:

    // 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
    
  • 由于允许使用 thread 特性的对象的声明,因此下面的两个示例在语义上是等效的:

    // 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)