如果希望每个线程都可以有线程局部(Thread local)的静态存储数据,可以使用TLS线程局部存储技术。TLS为进程分配一个TLS索引,进程的每个线程通过这个索引存取自己的数据变量的拷贝。
TLS对DLL是非常有用的。当一个新的进程使用DLL时,在DLL入口函数DllMain中使用TlsAlloc分配TLS索引,TLS索引就作为进程私有的全局变量被保存;以后,当该进程的新的线程使用DLL时(Attahced to DLL),DllMain给它分配动态内存并且使用TlsSetValue把线程私有的数据按索引保存。DLL函数可以使用TlsGetValue按索引读取调用线程的私有数据。
TLS函数如下:
DWORD TlsAlloc()
在进程或DLL初始化时调用,并且把返回值(索引值)作为全局变量保存。
BOOL TlsSetValue(
DWORD dwTlsIndex, //TLS index to set value for 
LPVOID lpTlsValue  //value to be stored 
);
其中:
dwTlsIndex是TlsAlloc分配的索引。
lpTlsValue是线程在TLS槽中存放的数据指针,指针指向线程要保存的数据。
线程首先分配动态内存并保存数据到此内存中,然后调用TlsSetValue保存内存指针到TLS槽。
LPVOID TlsGetValue(
DWORD dwTlsIndex  // TLS index to retrieve value for
);
其中:
dwTlsIndex是TlsAlloc分配的索引。
当要存取保存的数据时,使用索引得到数据指针。
BOOL TlsFree(
DWORD dwTlsIndex  // TLS index to free
);
其中:
dwTlsIndex是TlsAlloc分配的索引。
当每一个线程都不再使用局部存储数据时,线程释放它分配的动态内存。在TLS索引不再需要时,使用TlsFree释放索引。