线程本地存储,thread_local关键字是必须的吗?

Posted

技术标签:

【中文标题】线程本地存储,thread_local关键字是必须的吗?【英文标题】:Thread Local Storage, is thread_local keyword a must? 【发布时间】:2020-03-12 00:43:25 【问题描述】:

我正在尝试理解这个概念。

关键字thread_local__declspec(thread)是必须的吗?

在MSDN上的Using Thread Local Storage中,为什么变量dwTlsIndex没有用thread_local__declspec(thread)修饰?

【问题讨论】:

您阅读过 TlsAlloc() 的文档吗? 您将语言功能与 Windows SDK 功能混淆了。 【参考方案1】:

dwTlsIndex 本身不存储在任何线程本地内存中,这就是为什么它没有被标记为thread_local__declspec(thread)

这些关键字的目的是在每个正在运行的线程中声明给定变量的单独副本dwTlsIndex 并不是要以这种方式复制的。它是一个全局变量,在程序启动时通过TlsAlloc() 初始化1 次,然后由所有正在运行的线程平等共享。所以它不能本身存储在线程本地内存中。

每个线程都有自己的本地线程本地内存槽数组。 dwTlsIndex 指定这些数组中给定槽(变量)的索引。存储在线程局部内存中的给定变量的索引对于所有线程都是相同的。通过全局共享dwTlsIndex,所有线程都知道该变量访问哪个槽。

阅读 Microsoft 的文档以了解有关 Thread Local Storage 实际工作原理的更多详细信息。您专注于特定的代码示例,而不是关注全局。

【讨论】:

以上是关于线程本地存储,thread_local关键字是必须的吗?的主要内容,如果未能解决你的问题,请参考以下文章

线程局部存储: gcc __thread与c++11 thread_local 关键字

销毁 thread_local 对象

具有与 std::thread 不同的线程库的 C++ thread_local

C++ 线程局部变量thread_local

非静态数据成员的 thread_local 数据,再次

跨内核线程迁移后是不是可以强制重新加载 thread_local 变量?