什么是TLS?
如果需要在一个线程内部的各个函数调用都能访问、但其他线程不能访问的变量(被称为static memory local to a thread 线程局部静态变量),就需要新的机制来实现。这就是TLS。
TLS声明的空间,其他线程无法访问,增加了可移植性。
TlsAlloc(): 返回TLS索引
TlsSetValue(DWORD dwTlsIndex,LPVOID lpTlsValue):将一块空间与索引进行绑定。
TlsGetValue(DWORD dwTlsIndex): 获取与索引绑定的空间
TlsFree(DWORD dwTlsIndex):释放索引,使索引由占用转变为未占用,供下次索引申请使用。
这几个函数中,比较有有意思的是,TlsSetValue(DWORD dwTlsIndex ,LPVOID lpTlsValue),这个函数的具体意思是将索引与某个地址进行绑定,当再一次进行绑定的时候,上一个绑定地址不会释放,仍然会占用空间。在非第一次对索引与地址进行绑定时,需要检查就地址是否需要释放(TlsFree(DWORD dwTlsIndex)只是将索引进行释放,不释放绑定地址空间)。
注意两点:
使用TlsSetValue(DWORD dwTlsIndex,LPVOID lpTlsValue)时,思考是否以前绑定地址,重新绑定地址时,是否需要释放旧地址。
使用TlsFree(DWORD dwTlsIndex)时,思考是否需要释放绑定地址。
理论验证代码:
int main()
{
DWORD dwTlsIndex;
LPVOID lpvSomeValue;
dwTlsIndex = TlsAlloc();
LPTSTR pszBuf = NULL;
pszBuf = (LPTSTR)LovalAlloc(LPTR,sizeof(DWOR));
DWOR s = 0x12345678;
char k[100] = "hello my world ! ";
TlsSetValue(dwTlsIndex,(LPVOID)k);
//TlsSetValue(dwTlsIndex,pszBuf);
//TlsSetValue(dwTlsIndex,(lpvoid)&s);
lpvSomeValue = TlsGetValue(dwTlsIndex);
TlsFree(dwTlsIndex);
cout<<k<<endl;
return 0;
}