线程本地存储

进程的所有线程共享其虚拟地址空间。 函数的局部变量对运行函数的每个线程都是唯一的。 但是,静态变量和全局变量由进程中的所有线程共享。 使用 线程本地存储 (TLS) ,可以为进程可以使用全局索引访问的每个线程提供唯一数据。 一个线程分配索引,其他线程可以使用该索引来检索与索引关联的唯一数据。

常量TLS_MINIMUM_AVAILABLE定义每个进程中可用的 TLS 索引的最小数目。 对于所有系统,此最小值保证至少为 64。 每个进程的最大索引数为 1,088。

创建线程时,系统会为 TLS 分配一个 LPVOID 值数组,这些值初始化为 NULL。 索引必须由其中一个线程分配,然后才能使用索引。 每个线程将其 TLS 索引的数据存储在数组的 TLS 槽 中。 如果与索引关联的数据适合 LPVOID 值,则可以将数据直接存储在 TLS 槽中。 但是,如果以这种方式使用大量索引,最好分配单独的存储、合并数据,并最大程度地减少使用的 TLS 槽数。

下图演示了 TLS 的工作原理。 有关演示如何使用线程本地存储的代码示例,请参阅 使用线程本地存储

显示 T LS 过程工作原理的示意图。

进程有两个线程:线程 1 和线程 2。 它分配两个用于 TLS 的索引:gdwTlsIndex1 和 gdwTlsIndex2。 每个线程为存储数据的每个索引) 分配两个内存块, (一个内存块,并将指向这些内存块的指针存储在相应的 TLS 槽中。 为了访问与索引关联的数据,线程从 TLS 槽中检索指向内存块的指针,并将其存储在 lpvData 本地变量中。

最好在动态链接库中 (DLL) 中使用 TLS。 有关示例,请参阅 在动态链接库中使用线程本地存储

Visual C++) (线程本地存储

使用线程本地存储

在动态链接库中使用线程本地存储