微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

线程本地存储进程

如何解决线程本地存储进程

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

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

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

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

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

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

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

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

enter image description here

解决方法

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

如果您谈论的是原始 Windows API 而不是编译器辅助的线程本地存储,那么存储在 TLS 中的数据不是指针的要求,它可以是纯数字值(转换为 LPVOID 或从 LPVOID 转换),如果这对您的场景很有意义。

,

我的问题是 TLS 插槽中究竟存储了哪些值、内存地址或实际数据值?

两者都有!

链接中的以下段落涵盖了这一点:

如果与索引关联的数据适合 LPVOID 值,您可以将数据直接存储在 TLS 插槽中。但是,如果您以这种方式使用大量索引,则最好分配单独的存储空间,整合数据,并尽量减少 TLS 插槽的数量。

这是一种称为Sma​​ll Object O优化的技术,其中一些存储可以是值或指向其他一些内存位置取决于所存储内容的大小。该段落只是一种迂回的说法:

“如果可以,我们建议您使用 SOO,因为系统不会查看指针的值。”

如果是内存地址指针,我假设然后访问这些地址以获取存储在内存块中的值。

正确,但前提是您选择将存储用作指针。

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

不是真的,它只是一张大的指针表。如果您希望指针指向某个有意义的地方,则需要分配一些要指向的内存,但该分配没有什么特别之处。

,

如果您打算编写 C++ 并且您不需要专门使用 Win32 函数,那么您应该使用 C++11 thread_local。见https://en.cppreference.com/w/cpp/keyword/thread_local

这是便携式的,使用起来更容易。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。