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函数可以正确运行保证~线程安全~