线程本地存储(TLS)运行一个进程拥有自己的变量缓冲,保证对进程中的每个线程都是唯一的。这个变量缓冲很小,因为进程中每个线程在创建时都必然会创建一个TLS数组元素,但是如果灵活的使用,这个缓冲是足够的。具体讲,系统常数TLS_MINIMUM_AVAILABLE,定义了每个进程可以使用的TLS数组中槽的数目。在WinCE下,这个值为64,。所以每个进程拥有64个4字节变量,可以用来存储该进程中每个线程需要的唯一数据。为了得到更好的效果,当然,你必须自己管理这64个槽。
预留一个TLS槽,进程要调用函数:
DWORD TlsAlloc(void);TLSAlloc函数查询TLS槽的数组,找到一个可用的槽,将其标记为正在使用、并返回这个新分配的槽在数组中的索引值。如果没有可用的槽,该函数返回-1。重要的是,每个被创建的线程自身不能调用TlsAlloc,而是进程或dll,在她创建要使用这些TLS槽的线程之前调用这个函数。当一个槽被分配之后,每个线程的实例可以访问它放在槽中的独立数据,通过调用下面等函数:
BOOL TlssSetValue(DWORD dwTlsIndex,LPVOID lpTlsValue);
和LPVOID TlsGetValue(DWORD dwTlsIndex);
以上两个函数,TlsAlloc函数返回的TLS槽索引值指定了存放数据的槽,函数get和set的数据类型都是LPVOID,这个值可以用来做任何用途。将TLS值作为指针的优点就是,一个线程可以在堆中分配一块内存,并且将这块内存的指针保存在TLS值中。这样每个线程都能够维护一块大小能够自定义的线程独立数据。
线程本地存储还有一个值得注意的地方。当tlsalloc函数预留一个槽时,它将该槽的值置零,这是针对当前所有的正在运行的线程的。所有新创建线程的TLS数组值也被初始化为0。这意味着一个线程可以安全的假定它的TLS初值为0。这对一个线程在第一次调用例程时,确定自己是否要分配一块内存非常有用。
当一个进程不再需要一个TLS槽时,调用一下函数:
BOOL TlsAlloc(DWORD dwTlsIndex);
该函数传入需要释放的槽的索引值。该函数只释放槽,如果线程在堆中分配内存,并且将内存指针放在TLS槽中,该函数释放TLS槽中指针指向的内存。由线程负责释放它们自己申请的内存。