(1)TLS的机制原理
主要的数据结构就是两个,一个就是进程范围的全局索引数组,再一个就是线程范围的指针数组。这两个数组的大小是一样的,ms保证这两个数组的大小至少为TLS_MINIMUM_AVAILABLE。全局索引数组只是用来保存索引,也就是整型数据,指针数组只是用来保存指针。当某个进程的某个线程需要使用TLS时,就从全局索引数组申请一个索引号,这个索引号在被释放之前就不能被其他线程申请到了。这个索引号一般来都是用进程级别的全局变量来保存的,所以这个索引号对进程中的所有线程都是可见的,可访问的。只要某一个线程申请到了索引号i,那么进程内的所有线程的指针数组的相应位置i就被标记为占用。好了,现在进程中的每个线程就可以使用这个索引号i来向线程的指针数组的第i个位置传递各自所需的数据(实际上是数据指针,这个指针一般指向线程栈而不是全局堆)了,数据传递完毕后,线程就可以用这个索引号i来访问到自己之前设定的数据。也就是说,现在,进程中的所有线程都使用相同的索引号i来访问TLS数据,但却访问的并不是相同的数据,而是各个线程自己设定的数据。
(2)函数调用
DWORD TlsAlloc() 从全局索引数组申请一个索引号。
BOOL TlsSetValue(DWORD Index,PVOID pValue) 向指针数组索引号为Index的位置传入数据指针。
PVOID TlsGetValue(DWORD Index) 获取指针数组索引号为Index的位置的数据指针,然后把返回值解指针*就可以。
VOID TlsFree(DWORD Index)); 向全局索引数组返还索引号,即把Index标记为未使用。
(3)实例
常见的 strtok() 多线程版本,就是使用了TLS,以及windows 函数 GetLastError()也是如此。