Tls 线程局部存储

什么是TLS?

        如果需要在一个线程内部的各个函数调用都能访问、但其他线程不能访问的变量(被称为static memory local to a thread 线程局部静态变量),就需要新的机制来实现。这就是TLS。

      TLS声明的空间,其他线程无法访问,增加了可移植性。

        TlsAlloc(): 返回TLS索引

        TlsSetValue(DWORD dwTlsIndex,LPVOID lpTlsValue):将一块空间与索引进行绑定。

        TlsGetValue(DWORD dwTlsIndex): 获取与索引绑定的空间

        TlsFree(DWORD dwTlsIndex):释放索引,使索引由占用转变为未占用,供下次索引申请使用。

       这几个函数中,比较有有意思的是,TlsSetValue(DWORD dwTlsIndex ,LPVOID lpTlsValue),这个函数的具体意思是将索引与某个地址进行绑定,当再一次进行绑定的时候,上一个绑定地址不会释放,仍然会占用空间。在第一次对索引与地址进行绑定时,需要检查就地址是否需要释放(TlsFree(DWORD dwTlsIndex)只是将索引进行释放,不释放绑定地址空间)。

        注意两点:

使用TlsSetValue(DWORD dwTlsIndex,LPVOID lpTlsValue)时,思考是否以前绑定地址,重新绑定地址时,是否需要释放旧地址。

                使用TlsFree(DWORD dwTlsIndex)时,思考是否需要释放绑定地址。

理论验证代码:

                  

int main()
{
DWORD dwTlsIndex;
LPVOID lpvSomeValue;
dwTlsIndex = TlsAlloc();
LPTSTR pszBuf = NULL;
pszBuf = (LPTSTR)LovalAlloc(LPTR,sizeof(DWOR));
DWOR  s = 0x12345678;
char k[100] = "hello my world ! ";
TlsSetValue(dwTlsIndex,(LPVOID)k);
//TlsSetValue(dwTlsIndex,pszBuf);
//TlsSetValue(dwTlsIndex,(lpvoid)&s);
lpvSomeValue = TlsGetValue(dwTlsIndex);
TlsFree(dwTlsIndex);
cout<<k<<endl;
return 0;
}

       

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值