线程局部静态变量(static memory local to a thread)
----在一个线程内部的各个函数调用都能访问,但其它线程不能访问的变量。
区别于静态变量
进程中的全局变量与函数内定义的静态(static)变量,是各个线程都可以访问的共享变量。在一个线程修改的内存内容,对所有线程都生效。这是一个优点也是一个缺点。说它是优点,线程的数据交换变得非常快捷。说它是缺点,一个线程死掉了,其它线程也性命不保; 多个线程访问共享数据,需要昂贵的同步开销,也容易造成同步相关的BUG。
对TLS进行操作的的四个函数
(1)TlsAlloc
DWORD TlsAlloc(void); // 返回一个TLS索引
每个线程创建时系统给它分配一个LPVOID指针的数组(叫做TLS数组,长度为TLS_MINIMUM_AVAILABLE),TlsAlloc()函数的作用是返回访问当前线程的TLS数组的一个下标(索引),不同线程得到不同的索引变量值。
当调用TlsAlloc的时候,系统会挨个检查这个数组中成员的值,直到找到一个值为FREE的成员。把找到的成员的值由FREE改为INUSE后,TlsAlloc函数返回该成员的索引。如果不能找到一个值为FREE的成员,TlsAlloc函数就返回TLS_OUT_OF_INDEXES(在WinBase.h文件中定义为-1)
(2)TlsSetValue
BOOL TlsSetValue(
DWORD dwTlsIndex, // TLS 索引
LPVOID lpTlsValue // 要设置的值
);
将参数lpTlsValue指定的值放入索引为dwTlsIndex的线程数组成员中,调用成功,会返回TRUE。
(3)TlsGetValue
LPVOID TlsGetValue(DWORD dwTlsIndex ); // TLS索引
先检查TLS 索引值合法与否,如果合法,取得线程数组中索引为dwTlsIndex的成员的值。
(4)TlsFree
释放局部存储索引。
代码
//TLS索引,作全局变量
DWORD g_dwTlsIndex;
//得到TLS索引
g_dwTlsIndex = ::TlsAlloc();
//放入数据
DWORD dwStartTime = GetTickCount();
::TlsSetValue(g_dwTlsIndex,(LPVOID)dwStartTime);
//读出数据
DWORD dwStartTime = (DWORD)::TlsGetValue(g_dwTlsIndex);
//释放TLS
::TlsFree(g_dwTlsIndex);