【问题标题】:Thread Local Storage functioning线程本地存储功能
【发布时间】:2015-05-16 08:33:05
【问题描述】:

我试图了解 TLS 的工作原理,但我认为 Wikipedia 和 MSDN 提供的定义不同。

通过阅读 Wikipedia 页面,我的理解是 TLS 是一种映射数据的方法,通常对于进程的每个线程来说,这些数据在本地都是全局/静态的。如果这是真的,那么不同的线程无法访问其他线程的数据。

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

这似乎与维基百科所说的相反,问题在哪里?

【问题讨论】:

标签: multithreading thread-safety pthreads posix


【解决方案1】:

这里有两个混淆:

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

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

【讨论】:

  • 那么假设thread_1拥有一个对象的key,另一个线程链接在它的TLS中,thread_1可以修改它,对吧?
  • 取决于你的意思是什么类型的键。不幸的是,我在回复中在两种不同的上下文中使用了该术语,但现在应该修复了。
猜你喜欢
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
相关资源
最近更新 更多