【问题标题】:What is thread local storage? Why we need it?什么是线程本地存储?为什么我们需要它?
【发布时间】:2016-06-12 01:22:47
【问题描述】:

我正在阅读操作系统概念中的线程,我遇到了“线程本地存储 (TLS)”。我的理解是 TLS 类似于静态或全局数据,但它更独特于单个线程。这里的独特之处有点令人困惑?

为什么我们不能通过 runner(即线程的实际代码)函数将数据作为参数传递给这个函数?

【问题讨论】:

  • Why can't we pass the data ... as params to this function? - 这样您就可以将数据 local 用于给定函数,而 TLS 实现 global 数据。本地和全局数据是替代品,每个都有自己的道具。和缺点。
  • 几十年来我一直在编写多线程应用程序,还没有使用“全局线程”TLS。令人惊讶的是有多少开发人员。 'globals are bad' 很好,但很乐意使用 TLS。
  • 对于新手,我建议阅读The Linux Programming Interface一书的31: Threads: Thread Safety and Per-Thread Storage,你会在那里得到你所有的答案。
  • @Rick 感谢您推荐这本好书

标签: multithreading operating-system


【解决方案1】:

静态和全局数据在所有线程之间共享。如果您修改了全局/静态变量,则所有线程都可以看到它。如果您在 TLS 中创建变量,则与全局/共享变量不同,每个线程都有自己的变量副本,即对变量的更改是线程本地的。与通过 ds 段进行访问的全局变量不同,TLS 变量使用 (gs/fs) 段进行访问。了解它的一个好方法是查看编译器生成的反汇编。

【讨论】:

    【解决方案2】:

    假设您在 Ada 工作。在您的 Ada 程序中,您定义了一个任务(线程),其中包含一个只能由任务访问的 [静态] 变量。您现在创建任务的多个实例。然后,您需要为每个任务复制该 [静态] 变量。

    这就是您的实现可以使用线程本地存储的地方。换句话说,它是为程序中的每个线程复制的静态内存区域。

    作为 TLS 的替代方案,线程可以在堆栈顶部分配此类存储空间。

    【讨论】:

      【解决方案3】:

      我们需要线程本地存储来创建具有线程安全函数的,因为线程本地存储对函数的每次调用都有其相同全局数据的副本,所以它是安全的我想指出 copy on write 技术的实现是相同的。

      在具有全局数据的普通函数中,该数据的内容可以被多个线程更新并使其不可靠,但在线程本地存储中,您可以将其视为

      "当多重访问发生时全局变为本地"

      【讨论】: