TLS小记


在一个进程中拥有一个标记数组p[num],记录了整个进程TLS的使用情况。每一个线程均拥有一个专属于自己的LPVOID数组t[num],数组中的元素称为TLS Slot,其记录了该线程的TLS使用情况
,一个static全局整形变量int a在TLS下的实现步骤如下:首先由windows从数组p中动态分配一个标志元素来代表全局静态变量a并将其值设置成为已使用,分配所得的索引值为idx。假设此时整个进程中共存在着n个不同的线程,那么,分配一个Tls索引值idx的含义便可以理解为:每一个线程的t[idx](LocalDataStoreSlot)均存储了一份自己独有的a的拷贝。每一线程均可对自己的t数组中存储的数据进行读取和赋值。通过上述一个p数组和多个t数组的实现方式,便可以将单个共用的全局变量分解成为若干个线程的专属变量,从而实现TLS的功能。
进程中保留一个全局的数组来表示各个线程SLOT使用情况,当TLSALLOC产生一个可用的SLOT标志时,表示每个线程的该SLOT可以使用来保留自己的一份该数据的拷贝


typedef struct PMYSELF
{
 int INT_DATA1;
 int INT_DATA2;
 TCHAR MY_CHAR[20];
}MYSELF_DATA,*PMYSELF_DATA;

DWORD TLS_INDEX; //DLL中全局变量

void pf(PMYSELF_DATA pmself) //各个线程在运行中,使用的是自己的pmself的独立拷贝
{
 if(pmself!=NULL)
 {
  if(TlsGetValue(TLS_INDEX)==NULL) //当前的SLOT是否为空
  {
   TlsSetValue(TLS_INDEX,HeapAlloc(GetProcessHeap(),0,sizeof(MYSELF_DATA)));//空的话,将首次创建内存空间分配给该SLOT
  }
   memcpy(TlsGetValue(TLS_INDEX),pmself,sizeof(MYSELF_DATA));//将新的数据拷贝如SLOT
 }
        else 
        {
          printf("%s/n","Please init pmself and pmself!=NULL");   
        }
}
case DLL_PROCESS_ATTACH: 当DLL被加载时候分配个FREE的SLOT
        TLS_INDEX=TlsAlloc();

case DLL_PROCESS_DETACH: //回收
 TlsFree(TLS_INDEX);

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值