在一个进程中拥有一个标记数组p[num],记录了整个进程TLS的使用情况。每一个线程均拥有一个专属于自己的LPVOID数组t[num],数组中的元素称为TLS Slot,其记录了该线程的TLS使用情况
,一个static全局整形变量int a在TLS下的实现步骤如下:首先由windows从数组p中动态分配一个标志元素来代表全局静态变量a并将其值设置成为已使用,分配所得的索引值为idx。假设此时整个进程中共存在着n个不同的线程,那么,分配一个Tls索引值idx的含义便可以理解为:每一个线程的t[idx](LocalDataStoreSlot)均存储了一份自己独有的a的拷贝。每一线程均可对自己的t数组中存储的数据进行读取和赋值。通过上述一个p数组和多个t数组的实现方式,便可以将单个共用的全局变量分解成为若干个线程的专属变量,从而实现TLS的功能。
进程中保留一个全局的数组来表示各个线程SLOT使用情况,当TLSALLOC产生一个可用的SLOT标志时,表示每个线程的该SLOT可以使用来保留自己的一份该数据的拷贝
typedef struct PMYSELF
{
int INT_DATA1;
int INT_DATA2;
TCHAR MY_CHAR[20];
}MYSELF_DATA,*PMYSELF_DATA;
DWORD TLS_INDEX; //DLL中全局变量
void pf(PMYSELF_DATA pmself) //各个线程在运行中,使用的是自己的pmself的独立拷贝
{
if(pmself!=NULL)
{
if(TlsGetValue(TLS_INDEX)==NULL) //当前的SLOT是否为空
{
TlsSetValue(TLS_INDEX,HeapAlloc(GetProcessHeap(),0,sizeof(MYSELF_DATA)));//空的话,将首次创建内存空间分配给该SLOT
}
memcpy(TlsGetValue(TLS_INDEX),pmself,sizeof(MYSELF_DATA));//将新的数据拷贝如SLOT
}
else
{
printf("%s/n","Please init pmself and pmself!=NULL");
}
}
case DLL_PROCESS_ATTACH: 当DLL被加载时候分配个FREE的SLOT
TLS_INDEX=TlsAlloc();
case DLL_PROCESS_DETACH: //回收
TlsFree(TLS_INDEX);