线程本地存储
进程的所有线程共享其虚拟地址空间。 函数的局部变量对于运行函数的每个线程都是唯一的。 但是,静态变量和全局变量由进程中的所有线程共享。 使用 线程本地存储(TLS),可以为进程可以使用全局索引访问的每个线程提供唯一数据。 一个线程分配索引,其他线程可以使用该索引来检索与索引关联的唯一数据。
常量TLS_MINIMUM_AVAILABLE定义每个进程中可用的最小 TLS 索引数。 对于所有系统,保证此最小值至少为 64。 每个进程的最大索引数为 1,088。
创建线程时,系统会为初始化为 NULL 的 TLS 分配 LPVOID 值的数组。 在使用索引之前,必须由其中一个线程分配索引。 每个线程在数组中 TLS 槽中存储其 TLS 索引的数据。 如果与索引关联的数据将适合 LPVOID 值,则可以将数据直接存储在 TLS 槽中。 但是,如果采用这种方式使用大量索引,最好分配单独的存储、合并数据,并最大程度地减少正在使用的 TLS 槽数。
下图说明了 TLS 的工作原理。 有关说明使用线程本地存储的代码示例,请参阅 使用线程本地存储。
进程有两个线程:线程 1 和线程 2。 它分配两个索引用于 TLS、gdwTlsIndex1 和 gdwTlsIndex2。 每个线程分配两个内存块(一个用于每个索引),用于存储数据,并将指向这些内存块的指针存储在相应的 TLS 槽中。 若要访问与索引关联的数据,线程将从 TLS 槽检索指向内存块的指针,并将其存储在 lpvData 本地变量中。
最好在动态链接库(DLL)中使用 TLS。 有关示例,请参阅 使用动态链接库中的线程本地存储。
相关主题