线程本地存储进程
Thread local storage processes
我正在查看有关线程本地存储的文档,但我认为它写得不好。
https://docs.microsoft.com/en-us/windows/win32/procthread/thread-local-storage
他们写文档的方式似乎是零星的,他们会提供一个发生的事件,然后下一句他们会提供在这个事件之前需要发生什么的信息。然后另一个事件发生,他们会解释在这个事件之前需要发生什么。但一系列连续事件尚不清楚。通常他们会在一个句子中提供一个对象,然后下一个句子谈论另一个对象,同时揭示关于该对象的更多细节。
但据我了解,有一个全局索引,其中索引具有关联数据,一个线程分配索引,然后其他线程可以访问它。当创建线程时,会生成一个称为 TLS 槽的 LPVOID 值数组。与索引关联的数据然后存储在这个数组中。
我的困惑在于最后一部分,它说线程分配内存块,然后将指向这些内存块的指针存储在 LPVOID TLS 插槽中。并且存储在局部变量中的同时从 TLS 插槽中检索指向内存块的指针。
我的问题是 TLS 槽中到底存储了哪些值、内存地址或实际数据值?如果内存地址指针,我假设这些地址然后被访问以获取存储在内存块中的值。
分配 2 个内存 space 是否也是正确的,一个用于 LPVOID 数组值,另一个用于索引的内存 space 块?它说如果使用大量索引和LPVOID数组,最好分配一个单独的内存space以避免占用TLS插槽,这是内存块所指的吗,数据存储在内存块中而不是地址在插槽中以避免插槽中的数据过载?
阅读文档就像一个谜题,如果有人能提供帮助,我将不胜感激。我展示了他们提供的插图结构的图像。
enter image description here
TLS 插槽(图中的插槽)是线程信息块中 LPVOID 大小变量的固定大小数组。通常它们用于存储指针。这里存储的指针指向的内存不是线程本地的,而是正常分配的。但是,由于线程将指针存储在 TLS 插槽中, 是线程本地的,因此内存实际上是线程私有的。
如果您谈论的是原始 Windows API 而不是编译器辅助线程本地存储,则存储在 TLS 中的数据不需要是指针,它可以很简单数值(转换为 LPVOID 或从 LPVOID 转换)如果这对您的场景有意义。
My question is exactly what values are stored in the TLS slots, memory address or actual data values?
两者都有!
您的 link 中的以下段落涵盖了这一点:
If the data associated with an index will fit in an LPVOID value, you can store the data directly in the TLS slot. However, if you are using a large number of indexes in this way, it is better to allocate separate storage, consolidate the data, and minimize the number of TLS slots in.
这是一种称为 Small Object O优化的技术,其中一些storage 可以是一个值,也可以是指向其他内存位置的指针,具体取决于所存储内容的大小。段子只是迂回的说法:
“我们建议您尽可能使用 SOO,因为系统不会查看指针的值。”
And if memory address pointers, im supposing these addresses are then accessed to get the value stored at the memory block.
正确,但前提是您选择将存储用作指针。
Is it also correct that 2 memory spaces are allocated, one for LPVOID array values and there others for memory space blocks for the indexes? It said if using a large number of indexes and LPVOID arrays, its better to allocate a separate memory space to avoid occupying TLS slots, is this what the memory blocks refer to, data is stored in the memory blocks instead and addresses in slots to avoid data overload in the slots?
不是真的,它只是一大 table 指针。如果你想让指针指向有意义的地方,你需要分配一些内存来指向,但分配没有什么特别的。
如果您打算编写 C++,并且不需要专门使用 Win32 函数,那么您应该使用 C++11 thread_local
。参见 https://en.cppreference.com/w/cpp/keyword/thread_local
这是便携式的,使用起来更容易。
我正在查看有关线程本地存储的文档,但我认为它写得不好。
https://docs.microsoft.com/en-us/windows/win32/procthread/thread-local-storage
他们写文档的方式似乎是零星的,他们会提供一个发生的事件,然后下一句他们会提供在这个事件之前需要发生什么的信息。然后另一个事件发生,他们会解释在这个事件之前需要发生什么。但一系列连续事件尚不清楚。通常他们会在一个句子中提供一个对象,然后下一个句子谈论另一个对象,同时揭示关于该对象的更多细节。
但据我了解,有一个全局索引,其中索引具有关联数据,一个线程分配索引,然后其他线程可以访问它。当创建线程时,会生成一个称为 TLS 槽的 LPVOID 值数组。与索引关联的数据然后存储在这个数组中。
我的困惑在于最后一部分,它说线程分配内存块,然后将指向这些内存块的指针存储在 LPVOID TLS 插槽中。并且存储在局部变量中的同时从 TLS 插槽中检索指向内存块的指针。
我的问题是 TLS 槽中到底存储了哪些值、内存地址或实际数据值?如果内存地址指针,我假设这些地址然后被访问以获取存储在内存块中的值。
分配 2 个内存 space 是否也是正确的,一个用于 LPVOID 数组值,另一个用于索引的内存 space 块?它说如果使用大量索引和LPVOID数组,最好分配一个单独的内存space以避免占用TLS插槽,这是内存块所指的吗,数据存储在内存块中而不是地址在插槽中以避免插槽中的数据过载?
阅读文档就像一个谜题,如果有人能提供帮助,我将不胜感激。我展示了他们提供的插图结构的图像。
enter image description here
TLS 插槽(图中的插槽)是线程信息块中 LPVOID 大小变量的固定大小数组。通常它们用于存储指针。这里存储的指针指向的内存不是线程本地的,而是正常分配的。但是,由于线程将指针存储在 TLS 插槽中, 是线程本地的,因此内存实际上是线程私有的。
如果您谈论的是原始 Windows API 而不是编译器辅助线程本地存储,则存储在 TLS 中的数据不需要是指针,它可以很简单数值(转换为 LPVOID 或从 LPVOID 转换)如果这对您的场景有意义。
My question is exactly what values are stored in the TLS slots, memory address or actual data values?
两者都有!
您的 link 中的以下段落涵盖了这一点:
If the data associated with an index will fit in an LPVOID value, you can store the data directly in the TLS slot. However, if you are using a large number of indexes in this way, it is better to allocate separate storage, consolidate the data, and minimize the number of TLS slots in.
这是一种称为 Small Object O优化的技术,其中一些storage 可以是一个值,也可以是指向其他内存位置的指针,具体取决于所存储内容的大小。段子只是迂回的说法:
“我们建议您尽可能使用 SOO,因为系统不会查看指针的值。”
And if memory address pointers, im supposing these addresses are then accessed to get the value stored at the memory block.
正确,但前提是您选择将存储用作指针。
Is it also correct that 2 memory spaces are allocated, one for LPVOID array values and there others for memory space blocks for the indexes? It said if using a large number of indexes and LPVOID arrays, its better to allocate a separate memory space to avoid occupying TLS slots, is this what the memory blocks refer to, data is stored in the memory blocks instead and addresses in slots to avoid data overload in the slots?
不是真的,它只是一大 table 指针。如果你想让指针指向有意义的地方,你需要分配一些内存来指向,但分配没有什么特别的。
如果您打算编写 C++,并且不需要专门使用 Win32 函数,那么您应该使用 C++11 thread_local
。参见 https://en.cppreference.com/w/cpp/keyword/thread_local
这是便携式的,使用起来更容易。