2015-03-13 109 views
0

我想了解TLS是如何工作的,但我認爲維基百科和MSDN提供的定義是不同的。線程本地存儲功能

通過閱讀維基百科頁面,我的理解是,TLS是映射數據的一種方式,通常對於進程的每個線程而言,這些數據通常是全局/靜態的。如果這是真的,但不同的線程不能訪問其他線程的數據。

根據MSDN:「一個線程分配索引,其他線程可以使用該索引檢索與索引關聯的唯一數據」,因此看起來線程可以訪問其他線程的數據。

這似乎與維基百科所說的內容形成了鮮明的對比,哪裏出了問題?

+0

當引用外部信息時,鏈接它們總是一個好主意。 – alk 2015-03-14 11:19:59

+0

相關:http://stackoverflow.com/q/21015738/694576 – alk 2015-03-15 07:45:25

回答

0

兩個混淆這裏:

  • 首先,你分配一個(唯一的)TLS ID。使用該ID與相應的函數,每個線程都可以訪問其關聯的TLS數據。請注意,此ID必須分配一次,但所有線程都使用ID(不是數據!)。
  • 每個線程都可以訪問每個其他線程的數據,無論是否爲TLS。簡單的原因是線程共享一個內存空間(內存空間和線程大致構成了一個進程)。但是,獲取其他線程的TLS數據比較困難,但是一個線程可能會傳遞一個指針。

簡而言之,TLS的工作方式類似於C++映射。關鍵是一對線程ID和TLS ID。數據通常是一個可用於間接引用某些數據的指針。訪問元素時,只提供TLS ID,實現會添加調用線程的ID以形成查找的密鑰。不用說,訪問該地圖當然是線程安全的。

+0

因此,假設thread_1的TLS中鏈接了另一個線程的對象的鍵,thread_1可以修改它,對吧? – badnack 2015-03-18 00:08:17

+0

取決於你的意思是什麼樣的關鍵。不幸的是,在我的回覆中,我在兩種不同的背景下使用了這個術語,但現在應該修復。 – 2015-03-18 06:30:43