Ben*_*nor 6 c++ thread-local c++11
我试图了解thread_local限定符的工作原理以及实际变量的存储位置?这是在C++上.
假设我有一个包含多个成员变量的类.类的对象在堆上实例化,对象在2个线程之间共享.适当的锁定机制用于确保两个线程不会同时踩在成员变量上.
线程需要跟踪一些特定于线程的项目.所以我想在与Class声明相同的头文件中创建一个thread_local变量.据我了解,两个线程都会获得自己的这个变量副本,对吗?线程局部变量究竟存储在内存中的哪个位置?如果数据段,在执行期间如何获取正确的变量?
1.据我所知,两个线程都会得到这个变量的副本,对吗?
 是的。每个线程都有自己的 thread_local 变量副本。
2、线程局部变量到底存放在内存中的什么地方?如果是数据段,在执行过程中如何准确地获取正确的变量?
 thread_local 是线程本地存储概念的实现。TLS 被实现为每个线程对象的插槽表。每个线程都有自己的表副本。例如,在 TLS 的 Windows 实现中,该表位于线程的线程信息块内。当一个全局/静态变量被声明为 thread_local 时,它会与每个线程的一个表槽关联到相同的偏移量。当线程使用当前线程上下文访问 thread_local 变量时,将访问与该线程对象内的表槽关联的变量的线程自己的副本。请查看此链接以获取有关 TLS 实现的更多详细信息。https://en.wikipedia.org/wiki/Thread-local_storage
在 64 位 Windows 的情况下,TLS 可以通过 GS 选择器寄存器访问,每个线程使用单独的物理地址空间(在 CreateThread() 期间分配),尽管 Visual Studio 可能会将 TLS 映射到进程/线程虚拟地址空间,每个线程获得不同的虚拟地址,因为它是每个线程的不同物理地址。您可以通过使用调试器进入 rand() 来查看反汇编的代码,以查看它如何访问种子,这是一个 TLS 变量。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           2708 次  |  
        
|   最近记录:  |