在C/C++中实现线程局部存储(TLS)(多线程)

bro*_*oot 2 c linux memory multithreading c++11

我试图了解Thread-local storage (TLS) 类型的实现.可用在C++11thread_local关键字或在C作为__thread关键字.这篇维基百科文章说:

有时希望引用相同静态或全局变量的两个线程实际上是指不同的存储器位置,从而使得变量线程局部,一个规范的例子是C错误代码变量errno.

这用于为线程创建staticglobal变量本地,以便其他线程无法访问它们.

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

Rem*_*eau 5

TLS在每个线程对象中实现为数据数组.每个线程对象都有自己的数组本地副本,每个数组的大小相同.当您将全局/静态变量声明为使用TLS时,它会与这些数组的索引相关联(这就是编译器/操作系统知道要分配多少个数组插槽的方式).因此,当您在运行时访问变量时,您实际上是访问正在访问变量的线程上下文的数据数组中的关联槽.

TLS可能是C++ 11中的一个新的本机功能,但它已经在各种OS API中提供了很长时间.

TLS是使用Win32 API在Windows上实现的TlsAlloc(),TlsGetValue(),TlsSetValue(),和TlsFree()功能.以下是其工作原理概述: 线程本地存储

以下概述了TLS如何在Linux上运行:ELF处理线程局部存储

  • 它是一个每线程数组,而不是一个全局数组。一个线程不能访问另一个线程的数组,这就是使它对每个线程 **local** 的原因。每个线程上下文都有自己的数组副本。 (2认同)