簡體   English   中英

C ++ - thread_local變量存儲在哪里?

[英]C++ - Where are thread_local variables stored?

我試圖了解thread_local限定符的工作原理以及實際變量的存儲位置? 這是在C ++上。

假設我有一個包含多個成員變量的類。 類的對象在堆上實例化,對象在2個線程之間共享。 適當的鎖定機制用於確保兩個線程不會同時踩在成員變量上。

線程需要跟蹤一些特定於線程的項目。 所以我想在與Class聲明相同的頭文件中創建一個thread_local變量。 據我了解,兩個線程都會獲得自己的這個變量副本,對嗎? 線程局部變量究竟存儲在內存中的哪個位置? 如果數據段,在執行期間如何獲取正確的變量?

在64位Windows的情況下,可以通過GS選擇器寄存器訪問TLS,每個線程使用單獨的物理地址空間(在CreateThread()期間分配),盡管Visual Studio可以將TLS映射到進程/線程虛擬地址空間,每個線程獲得一個不同的虛擬地址,因為它是每個線程的不同物理地址。 您可以通過使用調試器進入rand()來查看反匯編代碼,以查看它如何訪問種子,這是一個TLS變量。

1.據我所知,兩個線程都會獲得自己的這個變量副本,對嗎?
是。 每個線程都有自己的thread_local變量副本。
2.線程局部變量到底存儲在哪里? 如果數據段,在執行期間如何獲取正確的變量?
thread_local是Thread Local Storage概念的實現。 TLS實現為包含每個線程對象的槽表。 每個線程都有自己的表副本。 例如,在Windows的TLS實現中,該表位於線程的線程信息塊內。 當全局/靜態變量聲明為thread_local時,它將與相同偏移量的每個線程的表槽相關聯。 當線程訪問thread_local變量然后使用當前線程上下文時,將訪問線程自己的與該線程對象中的表槽相關聯的變量的副本。 有關TLS實施的更多詳細信息,請查看此鏈接。 https://en.wikipedia.org/wiki/Thread-local_storage

您的描述聽起來想要將某些非靜態成員var標記為thread_local。 這是不允許的。

thread_local有點像static (全局),但特定於每個線程,而static在所有線程之間共享

每個線程擁有自己的內存范圍。 例如一個自己的堆棧。

http://en.cppreference.com/w/cpp/language/storage_duration Referen

暫無
暫無

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

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