c++ - 线程本地存储进程
问题描述
我正在查看有关线程本地存储的文档,但我认为它写得不好。
https://docs.microsoft.com/en-us/windows/win32/procthread/thread-local-storage
似乎他们编写文档的方式是零星的,他们将提供一个发生的事件,然后下一句他们将提供有关在此事件之前需要发生什么的信息。然后另一个事件发生了,他们会解释在这个事件之前需要发生什么。但顺序事件的链条尚不清楚。通常他们会在一个句子中提供一个对象,然后下一个句子谈论另一个对象,同时透露之前对象的更多细节。
但是据我了解,有一个全局索引,其中索引具有关联的数据,一个线程分配索引,然后其他线程可以访问它。当创建线程时,会生成一个称为 TLS 槽的 LPVOID 值数组。然后将与索引关联的数据存储在此数组中。
我的困惑在于最后一部分,它说线程分配内存块,然后将指向这些内存块的指针存储在 LPVOID TLS 插槽中。并且指向内存块的指针从 TLS 插槽中检索,同时存储在局部变量中。
我的问题是 TLS 插槽、内存地址或实际数据值中究竟存储了哪些值?如果内存地址指针,我假设这些地址然后被访问以获取存储在内存块中的值。
分配 2 个内存空间是否也正确,一个用于 LPVOID 数组值,另一个用于索引的内存空间块?它说如果使用大量索引和LPVOID数组,最好分配一个单独的内存空间以避免占用TLS插槽,这就是内存块所指的,数据存储在内存块中,地址存储在插槽中以避免插槽中的数据过载?
阅读文档就像一个难题,如果有人可以提供帮助,我将不胜感激。我已经展示了他们提供的图解结构的图像。
解决方案
TLS 插槽(图表中的插槽)是线程信息块中 LPVOID 大小的变量的固定大小数组。通常它们用于存储指针。这里存储的指针指向的内存不是线程本地的,而是正常分配的。然而,由于线程将指针存储在线程本地的 TLS 槽中,因此内存实际上是线程私有的。
如果您谈论的是原始 Windows API 而不是编译器辅助的线程本地存储,则不需要存储在 TLS 中的数据是指针,如果有意义的话,它可以是纯数值(与 LPVOID 之间的转换)适合您的场景。
推荐阅读
- python - 将字符串 0 和 1 转换为二进制等效 python
- html - 背景位置动画不流畅
- python - 在多维数组中将滑动窗口设置为列(来自 MATLAB 的 IM2COL) - Python
- javascript - SignalR 在使用 webpack 开发服务器代理时出现错误 [Invalid frame header]
- android - 如何在未经用户许可的情况下自动自动启动android应用程序?
- php - 如何使用 aweber api 添加新订阅者 ussign php 和 aweber OAuth 2.0 示例
- laravel - 使用 laravel 进行身份验证
- python - 给定一个整数数组,返回两个数字的索引,使它们加起来为特定目标
- electron - 你推荐什么电子通知?
- javascript - 以模态形式弹出显示日历