簡體   English   中英

線程本地存儲進程

[英]Thread local storage processes

我正在查看有關線程本地存儲的文檔,但我認為它寫得不好。

https://docs.microsoft.com/en-us/windows/win32/procthread/thread-local-storage

似乎他們編寫文檔的方式是零星的,他們將提供一個發生的事件,然后下一句他們將提供有關在此事件之前需要發生什么的信息。 然后另一個事件發生,他們會解釋在這個事件之前需要發生什么。 但順序事件鏈尚不清楚。 通常他們會在一個句子中提供一個對象,然后下一個句子談論另一個對象,同時揭示之前關於該對象的更多細節。

但是根據我的理解,有一個全局索引,其中索引具有關聯數據,一個線程分配索引,然后其他線程可以訪問它。 當創建線程時,會生成一個稱為 TLS 槽的 LPVOID 值數組。 然后將與索引關聯的數據存儲在該數組中。

我的困惑在於最后一部分,它說線程分配內存塊,然后將指向這些內存塊的指針存儲在 LPVOID TLS 插槽中。 指向內存塊的指針是從 TLS 插槽中檢索的,同時存儲在局部變量中。

我的問題是究竟什么值存儲在 TLS 插槽、內存地址或實際數據值中? 如果是內存地址指針,我假設然后訪問這些地址以獲取存儲在內存塊中的值。

分配 2 個內存空間是否也正確,一個用於 LPVOID 數組值,另一個用於索引的內存空間塊? 它說如果使用大量索引和LPVOID數組,最好分配一個單獨的內存空間以避免占用TLS插槽,這是內存塊所指的,數據存儲在內存塊中,地址在插槽中以避免插槽中的數據過載?

閱讀文檔就像一個難題,如果有人可以提供幫助,我將不勝感激。 我已經展示了他們提供的圖示結構的圖像。

在此處輸入圖片說明

TLS 插槽(圖中的插槽)是線程信息塊中 LPVOID 大小的變量的固定大小數組。 通常它們用於存儲指針。 存儲在這里的指針指向的內存不是線程本地的,而是正常分配的。 然而,由於該線程存儲在TLS插槽,這本地線程的指針,該內存是有效線程專用。

如果您談論的是原始 Windows API 而不是編譯器輔助的線程本地存儲,那么存儲在 TLS 中的數據不是指針的要求,如果有意義,它可以是純數字值(轉換為 LPVOID 或從 LPVOID 轉換)為您的方案。

我的問題是究竟什么值存儲在 TLS 插槽、內存地址或實際數據值中?

兩個都!

您的鏈接中的以下段落涵蓋了這一點:

如果與索引關聯的數據適合 LPVOID 值,您可以將數據直接存儲在 TLS 插槽中。 但是,如果您以這種方式使用大量索引,則最好分配單獨的存儲,合並數據,並盡量減少 TLS 插槽的數量。

這是公知的為S商場öbjectøptimization,其中一些存儲可以是一個值或一個指針,這取決於被存儲什么尺寸的一些其它存儲器位置的技術。 該段落只是一種迂回的說法:

“如果可以,我們建議您使用 SOO,因為系統不會查看指針的值。”

如果是內存地址指針,我假設然后訪問這些地址以獲取存儲在內存塊中的值。

正確,但前提是您選擇將存儲用作指針。

分配 2 個內存空間是否也正確,一個用於 LPVOID 數組值,另一個用於索引的內存空間塊? 它說如果使用大量索引和LPVOID數組,最好分配一個單獨的內存空間以避免占用TLS插槽,這是內存塊所指的,數據存儲在內存塊中,地址在插槽中以避免插槽中的數據過載?

不是真的,它只是一張大的指針表。 如果您希望指針指向某個有意義的地方,則需要分配一些要指向的內存,但該分配沒有什么特別之處。

如果您打算編寫 C++ 並且您不需要專門使用 Win32 函數,那么您應該使用 C++11 thread_local https://en.cppreference.com/w/cpp/keyword/thread_local

這是便攜式的,更容易使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM