线程本地存储,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 实际工作原理的更多详细信息。您专注于特定的代码示例,而没有关注更大的图景。