我正在尝试了解线程本地存储 (TLS)
类型的实现。在 C++11
中作为 thread_local
关键字可用,在 C
中作为 __thread
关键字可用。这wikipedia文章说:
Sometimes it is desirable that two threads referring to the same static or global variable are actually referring to different memory locations, thereby making the variable thread-local, a canonical example being the C error code variable
errno
.
这用于使 static
或 global
变量成为线程的本地变量,这样其他线程就无法访问它们。
我的问题是这些变量如何存储在内存中,以便它成为线程的本地变量?
毕竟这些本质上是全局/静态变量,是什么阻止其他线程访问它们?它们是否保存在一些特殊的数据段中?
最佳答案
TLS 被实现为每个线程对象中的数据数组。每个线程对象都有自己的本地数组副本,并且每个数组的大小都相同。当您将全局/静态变量声明为使用 TLS 时,它与这些数组的索引相关联(编译器/操作系统就是这样知道要分配多少数组槽的)。因此,当您在运行时访问变量时,实际上是在访问正在访问该变量的线程上下文的数据数组中的关联槽。
TLS 可能是 C++11 中的一项新的原生功能,但它已经在各种操作系统 API 中可用了很长时间。
TLS 在 Windows 上使用 Win32 API TlsAlloc()
、TlsGetValue()
、TlsSetValue()
和 TlsFree 实现()
函数。以下是其工作原理的概述:Thread Local Storage
以下是 TLS 如何在 Linux 上工作的概述:ELF Handling For Thread-Local Storage
关于c - C/C++(多线程)中线程本地存储(TLS)的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23122015/