首页
社区
课程
招聘
[求助]看了几个小时的TLS还是看不懂,帮忙
发表于: 2008-8-6 15:05 4091

[求助]看了几个小时的TLS还是看不懂,帮忙

2008-8-6 15:05
4091
百度 google WINDOWS核心编程查过了,还是看不懂。郁闷得很!


以下摘录<WINDOWS核心编程>chapter21

若要使用动态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

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 254
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
kanxue老大来帮忙
2008-8-6 16:00
0
雪    币: 254
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
汗,真没人帮我解释这个图了吗?
2008-8-6 20:53
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
4
我不懂。只能帮顶
2008-8-7 14:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
首先说清楚几个重要的问题。TLS_MINIMUM_ AVAILABLE是进程的东西。定义进程的TLS索引的最小数目,系统默认的好像是64。pvoid数组则是每个线程都有的。
然后就很好理解了。你要使用一个索引,先使用tlsalloc,它会找到一个free的索引,把索引置为inuse.然后就返回这个索引给你。然后你就可以用函数TlsSetValue来把储存的数据指向该索引了。当你使用了一个索引,比如说索引3。现有或以后生成的线程就不能再使用索引3了。这些线程里面的pvoid数组里索引3是不能使用的。上面的图表明的很清楚,索引3是白色的,表明它是不可用的。
最后一个问题很简单,因为这个图错了。最下面的那个应该是.....-1

PS. 兄弟上面的信息是你自己翻译的还是现在在看《windows核心编程》第四版中文版?看你的文字都弄得我不知道在说什么。如果是新出的那个第四版建议你不要看了。这本书翻译很多错误而且是炒冷饭。而且你最好直接看英文版的第五版。
2008-8-7 18:49
0
雪    币: 254
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
如果是这样就好。可是用tlsalloc找free返回的索引是存在全局变量里面啊。

这样后面的所有纯种使用tlssetvalue函数的时候,都是使用这个索引,那不是一样了吗?
2008-8-7 23:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
索引是进程的东西,当然是属于全局变量。你每次调用tlsalloc返回的是新的索引,不是原来的索引。然后再调用tlssetvalue来使用这个新的索引。类似代码如下:
dword index1 = 0;
index1 = tlsalloc();
if(!tlssetvalue(index1,lpValue))
{...    异常处理范围
}
lpValue就是你要储存的数据的指针
2008-8-8 09:46
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我太菜了,看不懂。。。。。
2009-7-11 08:48
0
游客
登录 | 注册 方可回帖
返回
//