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

标签 c++ c++11 thread-local

我想了解 thread_local 限定符究竟是如何工作的,以及实际变量存储在哪里?这是在 C++ 上。

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

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

最佳答案

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

关于C++ - thread_local 变量存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45847552/

相关文章:

c++ - 使用或不使用 C++0x 特性

java - 我的 ThreadLocal 始终包含并返回 null

c++ - Qt Creator 的新建项目向导中缺少 Qt 控制台应用程序

c++ - 将枚举作为函数参数传递

c++ - STL 容器上的 lambda+for_each+delete

java - ThreadLocal 中的多个对象

java - ThreadLocal单例

c++ - 如何使用调用纯虚拟成员的 std::function 初始化抽象类中的成员?

c++ - MPI发送和接收的通信成本

c++ - 在嵌套私有(private)类内部的外部类中使用 C++ 公共(public)变量