C++ - thread_local 变量存储在哪里?

C++ - Where are thread_local variables stored?

我想了解 thread_local 限定符的工作原理以及实际变量的存储位置?这是在 C++ 上。

假设我有一个包含多个成员变量的 class。 class 的对象在堆上实例化,该对象在 2 个线程之间共享。使用适当的锁定机制来确保两个线程不会同时踩踏一个成员变量。

线程需要跟踪少数线程特定项目。所以我想在与 Class 声明相同的头文件中创建一个 thread_local 变量。据我了解,两个线程都将获得该变量的自己的副本,对吗?线程局部变量究竟存放在内存的什么位置?如果是数据段,在执行过程中如何准确地获取正确的变量?

根据您的描述,您想将一些非静态成员变量标记为 thread_local。这是不允许的。

thread_local 有点像 static(全局),但特定于每个线程,而 static 是跨所有线程共享的

每个线程都有自己的内存范围。例如自己的堆栈。

http://en.cppreference.com/w/cpp/language/storage_durationReferen

1.据我了解,两个线程都将获得自己的此变量副本,对吗?
是的。每个线程都有自己的 thread_local 变量副本。
2。线程局部变量究竟存放在内存的什么位置?如果是数据段,在执行过程中如何准确地获取正确的变量?
thread_local 是线程本地存储概念的实现。 TLS 实现为每个线程对象的 table 个插槽。每个线程都有自己的 table 副本。例如,在 TLS 的 Windows 实现中,这个 table 在线程的线程信息块中。当 global/static 变量被声明为 thread_local 时,它将与每个线程的相同偏移量的 table 槽相关联。当线程访问 thread_local 变量然后使用当前线程上下文时,线程自己的与此线程对象中的 table 槽关联的变量副本将被访问。请检查此 link 以获取有关 TLS 实施的更多详细信息。 https://en.wikipedia.org/wiki/Thread-local_storage

在 64 位 Windows 的情况下,可以通过 GS 选择器寄存器访问 TLS,每个线程使用单独的物理地址 space(在 CreateThread() 期间分配),尽管 Visual Studio 可以将 TLS 映射到进程/线程虚拟地址 space,每个线程获得不同的虚拟地址,因为它是每个线程的不同物理地址。您可以通过使用调试器进入 rand() 来查看反汇编代码,以查看它如何访问种子,这是一个 TLS 变量。