我试图了解thread_local限定符的工作原理以及实际变量的存储位置?这是在C ++上。
假设我有一个包含多个成员变量的类。类的对象在堆上实例化,对象在2个线程之间共享。适当的锁定机制用于确保两个线程不会同时在成员变量上踩踏。
线程需要跟踪一些特定于线程的项目。所以我想在与Class声明相同的头文件中创建一个thread_local变量。据我了解,两个线程都会获得自己的这个变量副本,对吗?线程局部变量究竟存储在内存中的哪个位置?如果数据段,在执行期间获取正确变量的确切程度如何?
答案 0 :(得分:4)
对于64位Windows,可以通过GS选择器寄存器访问TLS,每个线程使用一个单独的物理地址空间(在CreateThread()期间分配),尽管Visual Studio可以将TLS映射到进程/线程虚拟地址空间,每个线程获得不同的虚拟地址,因为它是每个线程的不同物理地址。您可以通过使用调试器进入rand()来查看反汇编代码,以查看它如何访问种子,这是一个TLS变量。
答案 1 :(得分:3)
<强> 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
答案 2 :(得分:-1)
您的描述听起来想要将某些非静态成员var标记为thread_local。这是不允许的。
thread_local
有点像static
(全局),但特定于每个线程,而static
在所有线程中共享
每个线程都拥有自己的内存范围。例如一个自己的堆栈。
http://en.cppreference.com/w/cpp/language/storage_duration Referen