C++ 類不能使用 thread 屬性。但是,可以使用 thread 屬性將 C++ 類對像實例化。例如,以下代碼將生成一個編譯器錯誤: #define Thread __declspec( thread )
class Thread C // Error: classes cannot be declared Thread.
{
// Code
};
C CObject; 因為允許使用 thread 屬性的 C++ 對象的聲明,因此下面兩個示例在語義上是等效的:
#define Thread __declspec( thread )
Thread class B
{
// Code
} BObject; // OK--BObject is declared thread local.
class B
{
// Code
};
Thread B BObject; // OK--BObject is declared thread local.
不將執行緒本地對象的地址視為常數,並且涉及此類地址的任何表達式都不視為常數。在標準 C 中,這種作法的效果是禁止將執行緒本地變量的地址用作對像或指針的初始值設定項。例如,C 編譯器將以下代碼標記為錯誤: #define Thread __declspec( thread )
Thread int tls_i;
int *p = &tls_i; //This will generate an error in C. 但是,此限制不適用於 C++。因為 C++允許動態初始化所有對象,因此可以用使用執行緒本地變量地址的表達式初始化對象。實現此操作的方式與實現執行緒本地對像結構的方式相同。例如,以上顯示的代碼在作為 C++ 源檔案編譯時不會生成錯誤。請注意:只有在其中獲取地址的執行緒仍然存在的情況下,執行緒本地變量的地址才有效。
標準 C 允許使用涉及引用自身的表達式初始化對像或變量,但只適用於非靜態作用域的對象。雖然 C++ 通常允許使用涉及引用自身的表達式動態初始化對象,但是這種類型的初始化不允許用於執行緒本地對象。例如: #define Thread __declspec( thread )
Thread int tls_i = tls_i; // Error in C and C++
int j = j; // OK in C++、error in C
Thread int tls_i = sizeof( tls_i ) // Legal in C and C++ 請注意:包含正在初始化的對象的 sizeof 表達式不建立對自身的引用且在 C 和 C++ 中都是合法的。