【发布时间】:2018-02-01 12:08:43
【问题描述】:
我试图了解 thread_local 限定符的工作原理以及实际变量的存储位置?这是在 C++ 上的。
假设我有一个包含多个成员变量的类。该类的一个对象在堆上实例化,并且该对象在 2 个线程之间共享。使用适当的锁定机制来确保两个线程不会同时踩到一个成员变量。
需要线程来跟踪少数线程特定的项目。所以我想在与 Class 声明相同的头文件中创建一个 thread_local 变量。据我了解,两个线程都会得到自己的这个变量的副本,对吗?线程局部变量究竟存储在内存中的什么位置?如果是数据段,那么在执行过程中,正确的变量究竟是如何被拾取的?
【问题讨论】:
-
我认为这是实现定义的。
-
与 any 变量的存储位置一样,它是特定于实现的。
-
常见的实现有什么作用?说gcc。一般来说,我们可以考虑将使用 malloc/new 的动态分配放在堆上,将局部变量和函数参数放在堆栈上。大多数实现都坚持这一点。在这种情况下,thread_local 变量去哪儿了?
-
@Ben 线程局部变量是非常特定于实现的,因为底层操作系统线程设施不同(参见 Windows,POSIX)。
-
它的工作原理是魔法。想象一下,某处有一个普通的全局(互斥或以其他方式受到保护)
std::map<std::thread::id,void*> TLS。您可以使用TLS[std::this_thread::get_id()]检索您的 TLS。实际上,x86 上的实现使用%fs(或 32 位上的%gs)作为 TLS 段的基础。这真的很重要吗?
标签: c++ c++11 thread-local