首页
社区
课程
招聘
线程局部存储TLS的纠结问题
发表于: 2012-10-21 21:15 4567

线程局部存储TLS的纠结问题

2012-10-21 21:15
4567
看到TLS这一节,没有搞懂。

书上说;
windows为一个进程维护一个位数组,在为进程内的每一个线程分配一个同样长度的数组空间。
一般用主线程使用TlsAlloc得到一个索引 假设为2,再次用TlsAlloc的时候就不会得到2,假如我使用TlsSetValue(2,value)是把value放到这个线程分配到的数组空间的第三个单元么?
如果我有5个线程,只有线程1使用了索引2,其他四个线程没有用到,那不是这四个线程数组中的第3个单元就没有被使用,这不是浪费了么?

说法二;
其实好像TLS分配的类似于一个二维数组thread[0][100],thread[1][100]表示第一行的100个空间给线程1,第二行的100个空间给线程二,TlsAlloc返回的是列号,行号可以由线程自己确定,
。由于TlsAlloc不反回相同的索引, 如果没有被用到,还是浪费了空间啊。

如果我使用了许多个索引,那会浪费大量的空间啊。是我理解错了么
这两个说法是相同的么?
为什么要进程内的每一个线程分配一个同样长度的数组空间。不同长度的可以么?

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

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
2
线程局部存储是这样的,每个数组都有TLS_MINIMUM_AVAILABLE个元素,TLS_MINIMUM_AVAILABLE被定义为64个,
也就意味着,线程1分配的牵引,在线程2和线程3中都有没用到的话,这个数组的元素仍然是64个元素,再者,线程1只分配一个牵引号的话,数组的元素个数依然是64个。

这是固定的,一点点空间而已,一个数组的大小为64*4 = 256个字节。
2012-10-22 11:13
0
雪    币: 1037
活跃值: (117)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
补充楼上,对于静态的线程存储变量的话,系统会在每个线程创建的时候分配,意味着每个线程都有,在线程结束的时候收回.
2012-10-22 19:36
0
雪    币: 22
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我想楼主是想知道,各线程的TLS数组是各自的还是共用的吧,一个线程分配了的索引,其它线程是否还可以使用这个索引?我也想知道
2012-10-23 20:18
0
雪    币: 172
活跃值: (947)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
动态  值不一样索引一样
最后于 2020-4-3 16:02 被xiaozuzhi编辑 ,原因: 写错了
2020-4-3 15:13
0
游客
登录 | 注册 方可回帖
返回
//