TLS 线程局部存储

TLS(Thread Local Storage) 线程局部存储


 所有的线程都共享着进程的虚拟地址~ 局部变量为每个线程所独立共享的,静态变量和全局变量是进程中所有线程一起共享的~ TLS可以为线程提供一个唯一的数据用一个全局的索引~每个线程 有自己的副本~各个线程互不影响~其实所保存的数据就是线程关联的~

先看个图:


如图可见每个线程有自己独立的TLS表格,相当于一个数组,数组里保存着void *类型的数据~ 表格的大小TLS_MINIMUM_AVAILABLE 定义的~ 微软定义在系统中最小不得少于64,最大每个进程1088项

线程的TLS数据其实保存在线程的TEB中 偏移地址为0xe10 


使用TLS涉及到四个函数

  • TlsAlloc (申请Tlslots索引,申请的索引号在所有的线程中的TLS中更新为已使用)
  • TlsFree (释放已申请的索引,如果对应索引指向的数据是动态申请的记得释放)
  • TlsSetValue(设置相应索引号的数据,只有当前线程的对应索引的数据得到更新,其他线程不变,这样保证了相同的索引号不同线程的不同数据做到了数据的线程相关)
  • TlsGetValue(获取线程相应索引号的数据)

    创建线程的时候(_beginthreadex)有使用到TLS用来保存线程相关的数据(CreateThread和_beginthreadex区别就是在这个地方),使得多线程时的C函数可以正确运行保证~线程安全~





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值