use*_*770 8 multithreading operating-system
我正在阅读操作系统概念中的线程,我遇到了“线程本地存储(TLS)”。我的理解是TLS类似于静态或全局数据,但它对于单个线程来说更独特。它对这里的独特之处有点困惑?
为什么我们不能通过runner(即线程的实际代码)函数将数据作为参数传递给这个函数?
假设您在 Ada 工作。在 Ada 程序中,您定义一个任务(线程),其中包含一个只能由该任务访问的[静态]变量。您现在创建任务的多个实例。然后,您需要为每个任务提供该[静态]变量的副本。
这就是您的实现可以使用线程本地存储的地方。换句话说,它是为程序中的每个线程复制的静态内存区域。
作为 TLS 的替代方案,线程可以在堆栈顶部分配此类存储。
静态和全局数据在所有线程之间共享。如果你修改了一个全局/静态变量,它对所有线程都是可见的。与在 TLS 中创建变量的全局/共享变量不同,每个线程都有自己的变量副本,即对变量的更改是线程本地的。与通过ds段进行访问的全局变量不同,TLS 变量是使用 ( gs/fs ) 段访问的。了解它的一个好方法是查看编译器生成的反汇编。
我们需要线程本地存储来创建具有线程安全函数的库,因为线程本地存储每次调用函数都有相同全局数据的副本,所以它是安全的我想指出实现是写时复制技术也是如此 。
在具有全局数据的普通函数中,该数据的内容可以由多个线程更新并使其不可靠,但在线程本地存储中,您可以将其视为
“当发生多重访问时,全局变成本地”
| 归档时间: |
|
| 查看次数: |
7532 次 |
| 最近记录: |