Can you summarize the following document?
        
  每個程序都有一組標誌,共TLS_MINIMUM_AVAILABLE(==64)個。每個標誌可以被設為FREE或INUSE,表示該TLS元素是否正在使用。注意這組標誌屬程序所有。當系統建立一個執行緒的時候,會為該執行緒分配與執行緒關聯的、屬於執行緒自己的PVOID型陣列(共有TLS_MINIMUM_AVAILBALE個元素),陣列中的每個PVOID可以儲存任意值。  Windows API函式codice_3用於獲取程序中一個未用的"TLS slot index"。然後將該標誌從FREE改為INUSE,並返回該標誌在位陣列中的索引,通常將該索引儲存在一個全域性變數中,因為這個值會在整個程序範圍內(而不是執行緒範圍內)使用。  呼叫TlsSetValue(dwTlsIndex,pvTlsValue)將一個PVOID值放到執行緒的陣列中dwTlsIndex指定的具體位置。  函式codice_4與codice_5用於通過"TLS slot index"讀寫一個執行緒區域性儲存變數所指向的記憶體塊。函式codice_6用於釋放"TLS slot index"。  在Win32執行緒資訊塊的FS:[0x2C]地址處,存放的是執行緒區域性儲存表的地址。每個執行緒用它自己的執行緒區域性儲存表的拷貝。TlsAlloc返回表中一個未使用的索引。因此每個執行緒可以用TlsSetValue(index)設定執行緒區域性儲存值,用TlsGetValue(index)獲取執行緒區域性儲存值。  Windows可執行程式也可以定義一個節(section),對映到程序每個執行緒的不同的記憶體分頁。這種節只定義在主程式裡,動態連結庫(DLL)不應該包含這種節因為不會被LoadLibrary函式在載入時初始化。  對於Windows系統來說,全域性變數或靜態變數會被放到".data"或".bss"段中,但當使用__declspec(thread)定義一個執行緒私有變數的時候,編譯器會把這些變數放到PE檔案的".tls"段中。當系統啟動一個新的執行緒時,它會從程序的堆中分配一塊足夠大小的空間,然後把".tls"段中的內容複製到這塊空間中,於是每個執行緒都有自己獨立的一個".tls"副本。所以對於用__declspec(thread)定義的同一個變數,它們在不同執行緒中的地址都是不一樣的。對於一個TLS變數來說,它有可能是一個C++的全域性物件,那麼每個執行緒在啟動時不僅僅是複製".tls"的內容那麼簡單,還需要把這些TLS物件初始化,必須逐個地呼叫它們的全域性建構函式,而且當執行緒退出時,還要逐個地將它們析構,正如普通的全域性物件在程序啟動和退出時都要構造、析構一樣。Windows PE檔案的結構中有個叫資料目錄的結構。它總共有16個元素,其中有一元素下標為IMAGE_DIRECT_ENTRY_TLS,這個元素中儲存的地址和長度就是TLS表(IMAGE_TLS_DIRECTORY結構)的地址和長度。TLS表中儲存了所有TLS變數的建構函式和解構函式的地址,Windows系統就是根據TLS表中的內容,在每次執行緒啟動或退出時對TLS變數進行構造和析構。TLS表本身往往位於PE檔案的".rdata"段中。

  Pthreads API定義了執行緒特定的資料。  函式codice_7與codice_8建立與刪除一個鍵,用於執行緒特定的資料。鍵的型別被稱為codice_9。鍵可以被所有執行緒看到。在每個執行緒,鍵可以用codice_10函式關聯到執行緒特定的資料。資料可以隨後用codice_11函式獲取。

  

  C11的關鍵字codice_12用於定義執行緒區域性變數。在標頭檔案codice_13定義了codice_14為上述關鍵詞的同義。例如:  C++11引入了codice_14關鍵字用於下述情形:  此外,不同編譯器提供了各自的方法宣告執行緒區域性變數:  Windows的版本早於Vista與Server 2008, codice_19對於DLL只用於DLL被可執行程式繫結靜態載入,在"LoadLibrary()"函式動態載入DLL將報告protection fault或data corruption。

  Java語言中,執行緒區域性變數使用類物件表示。ThreadLocal保持了變數的型別T,可以通過get/set方法訪問。例如,ThreadLocal保持了Integer值: Oracle/OpenJDK使用作業系統執行緒以避免效能代價。

  .NET Framework語言,靜態域可標記ThreadStatic attribute: .NET 4.0,System.Threading.ThreadLocal<T>可用於分配與惰性裝入執行緒區域性變數。 Also an API is available for dynamically allocating thread-local variables.

  [[Python語言]]從版本2.4開始,"threading"模組的"local"類可用於建立執行緒區域性儲存:

  [[Ruby語言]]能建立/訪問執行緒區域性變數使用[]=/[]方法:

  [[Category:執行緒]]
執行緒區域性儲存 (TLS) 是一種儲存持續期(storage duration),物件的儲存是線上程開始時分配,執行緒結束時回收,每個執行緒有該物件自己的例項。這種物件的連結性(linkage)可以是靜態的也可是外部的。