2016-02-29 119 views
0

我正在閱讀操作系統概念中的主題,並且遇到了「線程本地存儲(TLS)」。我的理解是,TLS與靜態或全局數據類似,但對於單個線程來說更爲獨特。它有點混淆了這裏的獨特之處?什麼是線程本地存儲?我們爲什麼需要它?

爲什麼我們不能通過runner(即線程的實際代碼)將數據作爲參數傳遞給這個函數?

+0

'爲什麼我們不能將數據作爲參數傳遞給這個函數?''''''''''''''''''''''''''本地和全球數據是*替代品*,每個都有自己的道具。和缺點。 – Tsyvarev

+0

我已經寫了幾十年的mutithreaded應用程序,但並未使用線程'TLS'的全局變量。有多少開發者感到驚訝。 'globals are bad'很好,但很高興使用TLS。 –

回答

1

讓我們假設你在阿達工作。在你的Ada程序中,你定義了一個任務(線程),其中包含一個只能由任務訪問的[靜態]變量。您現在創建任務的多個實例。然後,您需要每個任務的該[靜態]變量的副本。

這就是您的實現可以使用線程本地存儲的地方。換句話說,它是爲程序中的每個線程複製的靜態內存區域。

作爲TLS的替代方案,線程可以在堆棧頂部分配這樣的存儲。

0

靜態和全局數據在所有線程之間共享。如果您修改了全局/靜態變量,則它對所有線程均可見。與全局變量/共享變量不同,如果您在TLS中創建變量,則每個線程都有自己的變量副本,即對變量的更改對於線程是本地的。與全局變量不同,在全局變量中,通過段來訪問,使用(gs/fs)段來訪問TLS變量。瞭解它的一個好方法是查看編譯器生成的反彙編。

相關問題