共用方式為


執行緒

Microsoft 特定的

thread 擴充儲存類別修飾詞是用來宣告執行緒區域變數。

__declspec( thread ) declarator

備註

執行緒區域儲存區 (Thread Local Storage,TLS) 是一種機制,讓多執行緒處理序中的每個執行緒用來配置儲存區,以儲存執行緒特定資料。 在標準多執行緒程式中,資料是在特定處理序的所有執行緒之間共用,而執行緒區域儲存區則是用於配置每個執行緒資料的機制。 如需執行緒的完整討論,請參閱多執行緒

執行緒區域變數的宣告必須使用擴充屬性語法和 __declspec 關鍵字與 thread 關鍵字。 例如,下列程式碼宣告整數執行緒區域變數,並使用值將它初始化:

__declspec( thread ) int tls_i = 1;

在宣告執行緒區域物件和變數時,您必須遵守下列方針:

  • 您只能將 thread 屬性套用至資料宣告和定義,以及沒有成員函式的類別,thread 無法在函式宣告或定義中使用。

  • 使用 thread 屬性可能會干擾 DLL 匯入的延遲載入

  • 您只能在具有靜態儲存期的資料項目上指定 thread 屬性。 這包括全域資料物件 (static 和 extern)、區域靜態物件和類別的靜態資料成員。 您無法使用 thread 屬性來宣告自動資料物件。

  • 不論是在相同的檔案還是不同的檔案進行宣告和定義,您都必須將 thread 屬性用於執行緒區域物件的宣告和定義中。

  • 您不能使用 thread 屬性做為類型修飾詞。

  • 只有 POD 類別可以使用 __declspec(thread) 進行具現化。 如果沒有在類別宣告中宣告物件,則會忽略 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++ 中都是允許的。

END Microsoft 特定的

請參閱

參考

__declspec

C++ 關鍵字

概念

執行緒區域儲存區