C++ - thread_local变量存储在哪里?
C++ - Where are thread_local variables stored?
我试图了解限定符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
- 谷歌测试中的期望值存储在哪里
- 常量参数存储在哪里 (C++)?
- 此递归函数的每次迭代的值存储在哪里?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 模板参数在 C++ 中存储在哪里?
- C++ - thread_local变量存储在哪里?
- 返回值存储在哪里?
- glVertexAttribDivisor 存储在哪里 - VAO、VBO 或全局状态?
- 虚拟函数在哪里使用 vpointer to vtable 来解析方法调用,非虚拟方法存储在哪里以及如何解析它们?
- 为什么类型转换对象不会更改其地址?有关对象类型的信息存储在哪里?
- C++ - 函数中的局部指针变量具有什么类型的存储持续时间以及它们存储在哪里?
- bazel 项目将其".so"文件存储在哪里?
- 返回对象存储在哪里
- OpenSSL dll文件存储在哪里
- 如果我在我的函数中返回一个类,它存储在哪里
- 变量名称存储在哪里
- 引用变量存储在哪里
- 数组的指针,该数组的每个元素的内存空间信息存储在哪里
- 常量数据存储在哪里
- 编译时局部变量存储在哪里