首页 > 解决方案 > 线程本地存储进程

问题描述

我正在查看有关线程本地存储的文档,但我认为它写得不好。

https://docs.microsoft.com/en-us/windows/win32/procthread/thread-local-storage

似乎他们编写文档的方式是零星的,他们将提供一个发生的事件,然后下一句他们将提供有关在此事件之前需要发生什么的信息。然后另一个事件发生了,他们会解释在这个事件之前需要发生什么。但顺序事件的链条尚不清楚。通常他们会在一个句子中提供一个对象,然后下一个句子谈论另一个对象,同时透露之前对象的更多细节。

但是据我了解,有一个全局索引,其中索引具有关联的数据,一个线程分配索引,然后其他线程可以访问它。当创建线程时,会生成一个称为 TLS 槽的 LPVOID 值数组。然后将与索引关联的数据存储在此数组中。

我的困惑在于最后一部分,它说线程分配内存块,然后将指向这些内存块的指针存储在 LPVOID TLS 插槽中。并且指向内存块的指针从 TLS 插槽中检索,同时存储在局部变量中。

我的问题是 TLS 插槽、内存地址或实际数据值中究竟存储了哪些值?如果内存地址指针,我假设这些地址然后被访问以获取存储在内存块中的值。

分配 2 个内存空间是否也正确,一个用于 LPVOID 数组值,另一个用于索引的内存空间块?它说如果使用大量索引和LPVOID数组,最好分配一个单独的内存空间以避免占用TLS插槽,这就是内存块所指的,数据存储在内存块中,地址存储在插槽中以避免插槽中的数据过载?

阅读文档就像一个难题,如果有人可以提供帮助,我将不胜感激。我已经展示了他们提供的图解结构的图像。

在此处输入图像描述

标签: c++multithreadingprocess

解决方案


TLS 插槽(图表中的插槽)是线程信息块中 LPVOID 大小的变量的固定大小数组。通常它们用于存储指针。这里存储的指针指向的内存不是线程本地的,而是正常分配的。然而,由于线程将指针存储在线程本地的 TLS 槽中,因此内存实际上线程私有的。

如果您谈论的是原始 Windows API 而不是编译器辅助的线程本地存储,则不需要存储在 TLS 中的数据是指针,如果有意义的话,它可以是纯数值(与 LPVOID 之间的转换)适合您的场景。


推荐阅读