线程本地存储,thread_local关键字是必须的吗?
Thread Local Storage, is thread_local keyword a must?
我正在尝试理解这个概念。
关键字 thread_local
或 __declspec(thread)
是必须的吗?
在MSDN的Using Thread Local Storage中,为什么变量dwTlsIndex
没有用thread_local
或__declspec(thread)
修饰?
dwTlsIndex
本身不存储在任何线程本地内存中,这就是为什么它没有标记为 thread_local
或 __declspec(thread)
.
这些关键字的目的是在每个 运行 线程中声明给定变量的 单独副本 。 dwTlsIndex
不应该以这种方式复制。它是一个全局变量,在程序启动时通过 TlsAlloc()
初始化 1 次,然后由所有 运行 线程平均共享。所以它不能本身存储在线程本地内存中。
每个线程都有自己的本地线程本地内存槽数组。 dwTlsIndex
指定给定槽(变量)在这些数组中的索引。存储在线程本地内存中的给定变量的索引对于所有线程都是相同的。通过全局共享 dwTlsIndex
,所有线程都知道该变量访问哪个插槽。
阅读 Microsoft 的文档,了解有关 Thread Local Storage 实际工作原理的更多详细信息。您专注于特定的代码示例,而没有关注更大的图景。
我正在尝试理解这个概念。
关键字 thread_local
或 __declspec(thread)
是必须的吗?
在MSDN的Using Thread Local Storage中,为什么变量dwTlsIndex
没有用thread_local
或__declspec(thread)
修饰?
dwTlsIndex
本身不存储在任何线程本地内存中,这就是为什么它没有标记为 thread_local
或 __declspec(thread)
.
这些关键字的目的是在每个 运行 线程中声明给定变量的 单独副本 。 dwTlsIndex
不应该以这种方式复制。它是一个全局变量,在程序启动时通过 TlsAlloc()
初始化 1 次,然后由所有 运行 线程平均共享。所以它不能本身存储在线程本地内存中。
每个线程都有自己的本地线程本地内存槽数组。 dwTlsIndex
指定给定槽(变量)在这些数组中的索引。存储在线程本地内存中的给定变量的索引对于所有线程都是相同的。通过全局共享 dwTlsIndex
,所有线程都知道该变量访问哪个插槽。
阅读 Microsoft 的文档,了解有关 Thread Local Storage 实际工作原理的更多详细信息。您专注于特定的代码示例,而没有关注更大的图景。