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