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

C++ - Where are thread_local variables stored?

本文关键字:存储 在哪里 变量 local thread C++      更新时间:2023-10-16

我试图了解限定符thread_local究竟是如何工作的以及实际变量的存储位置?这是在C++。

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

线程需要跟踪几个特定于线程的项目。所以我正在考虑在与类声明相同的头文件中创建一个 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 变量(。

您的描述听起来您想将一些非静态成员 var 标记为thread_local。这是不允许的。

thread_local有点像static(全局(,但特定于每个线程,而static在所有线程之间共享

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

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