c - C/C++(多线程)中线程本地存储(TLS)的实现

标签 c linux multithreading memory c++11

我正在尝试了解线程本地存储 (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.

这用于使 staticglobal 变量成为线程的本地变量,这样其他线程就无法访问它们。

我的问题是这些变量如何存储在内存中,以便它成为线程的本地变量?
毕竟这些本质上是全局/静态变量,是什么阻止其他线程访问它们?它们是否保存在一些特殊的数据段中

最佳答案

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/

相关文章:

c++ - 发布和调试编译程序的源代码是否有所不同? [C/C++]

linux - 如何更改 perf_event_open 最大采样率

angular - 无法从 nativescript worker 访问 Angular 服务

c# - 正确的线程管理方式

c - 使用 strcmp 的段错误 (Ubuntu)

c - 为什么正则表达式总是返回 1?

c - 在特定内存位置嵌入常量

c - 如何在 Linux 中使用 gethostbyname_r

linux - ds3234的片选设置

c++ - 具有::InterlockedIncrement 的唯一 ID (VC++)