线程本地存储功能

时间:2015-03-13 18:22:39

标签: multithreading thread-safety pthreads posix

我试图理解TLS是如何工作的,但我认为维基百科和MSDN提供的定义是不同的。

通过阅读维基百科页面,我的理解是TLS是一种映射数据的方法,这些数据通常在本地为进程的每个线程提供全局/静态。如果这是真的,则不同的线程无法访问其他线程的数据。

根据MSDN:“一个线程分配索引,其他线程可以使用它来检索与索引关联的唯一数据”,因此看起来线程可以访问其他线程的数据。

这似乎与维基百科所说的相反,哪里有捕捉?

1 个答案:

答案 0 :(得分:0)

这里有两个混淆:

  • 首先,您分配一个(唯一的)TLS ID。将该ID与相应的函数一起使用,每个线程都可以访问其关联的TLS数据。请注意,此ID必须分配一次,但所有线程都使用ID(而不是数据!)。
  • 每个线程都可以访问其他所有线程的数据,无论它是否为TLS。原因很简单,线程共享一个内存空间(内存空间和线程大致构成一个进程)。获取其他一些线程的TLS数据虽然更难,但一个线程可以例如传递指针。

简而言之,TLS的工作方式类似于C ++地图。关键是一对线程ID和TLS ID。数据通常是指针,可用于间接引用某些数据。访问元素时,只提供TLS ID,实现添加调用线程的ID以形成查找键。不用说,访问该地图当然是线程安全的。