线程本地存储

【勇芳软件工作室】汉化HomePreviousNext

进程的所有线程都共享该进程的虚拟地址空间和全局变量。线程函数的局部变量是运行该函数的每个线程的局部变量。但是,该函数使用的静态或全局变量对所有线程具有相同的值。使用线程本地存储(TLS),您可以为每个线程创建一个变量的唯一副本。使用TLS,一个线程分配一个索引,该索引可以由进程的任何线程用来检索其唯一的副本。

使用以下步骤来实现TLS:

1.在进程或动态链接库(DLL)初始化期间使用TlsAlloc函数来分配TLS索引。

2.对于需要使用TLS索引的每个线程,分配动态存储,然后使用TlsSetValue函数将索引与指向动态存储的指针相关联。

3.当需要线程访问其存储时,请在调用TlsGetValue函数中指定TLS索引以检索指针。

4.当每个线程不再需要与TLS索引相关联的动态存储时,它必须释放索引。当所有线程完成使用TLS索引后,使用TlsFree函数来释放索引。

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

在DLL中使用TLS是理想的选择。在连接到DLL的进程或线程的上下文中执行DllEntryPoint函数中的初始TLS操作。当新进程附加到DLL时,在入口点函数中调用TlsAlloc为该进程分配一个TLS索引。然后将TLS索引存储在每个附加进程都是私有的全局变量中。当新线程附加到DLL时,在入口点函数中为该线程分配动态内存,并使用TlsAlloc中的TLS索引TlsAlloc将私有数据保存到索引。然后您可以使用TLS索引来调用TlsGetValue从DLL中的任何函数访问调用线程的私有数据。当一个进程与DLL分离时,请调用TlsFree.

有关使用线程本地存储的示例,请参阅使用线程本地存储.