若要使用动态TLS,首先必须调用Tlsalloc;c函数:TlsAlloc()
这个函数命令系统对进程中的位标志进行扫描,并找出一个FREE标志。然后系统将该标
志从FREE改为I N U S E,并且T l s A l l o c返回位数组中的标志的索引。D L L(或应用程序)通常将该索引保存在一个全局变量中
当创建一个线程时,便分配一个
TLS_MINIMUM_AVAILABLEP PVOID值的数组,并将它初始化为0,然后由系统将它与线程联系起来。如图2 1 - 1所示,每个线程均得到它自己的数组,数组中的每个P V O I D可以存储任何值。
在能够将信息存储在线程的PVOID数组中之前,必须知道数组中的哪个索引可供使用,这就是前面调用T l s A l l o c所要达到的目的。按照设计概念,TlsAlloc为你保留了一个索引。如果TlsAlloc返回索引3,那么就说明目前在进程中运行的每个线程中均为你保留了索引3,而且在将来创建的线程中也保留了索引3。
若要将一个值放入线程的数组中,可以调用T l s S e t Va l u e函数:
TlsSetValue(dword dwtlsindex,PVOID pvtlsvalue)该函数将一个PVOID值(用pvtlsvalue参数标识)放入线程的数组中由
dwtlsindex参数标识的索引处。Pvtlsvalue的值与调用TlsSetValue的线程相联系
(以上是摘录)
照这样的大意来说,就是每个线程都有自己的一个pvoid类型的数组,并且都各自拥有
T L S _ M I N I M U M _ AVA I L A B L E P 个元素,这样理解对吗?
问题2,大家看下我标出来的两次红色位置,这两次都提到了TlsAlloc返回的索引,可它们都联系不起来啊,希望各位朋友帮我解答下。谢谢
顺便问下,为什么上面数组中最大下标一处是TLS_MINIMUM_AVAILABLEP-1
一处是TLS_MINIMUM_AVAILABLEP-2