线程局部静态变量TLS(c++)

线程局部静态变量(static memory local to a thread)

----在一个线程内部的各个函数调用都能访问,但其它线程不能访问的变量。

区别于静态变量

进程中的全局变量与函数内定义的静态(static)变量,是各个线程都可以访问的共享变量。在一个线程修改的内存内容,对所有线程都生效。这是一个优点也是一个缺点。说它是优点,线程的数据交换变得非常快捷。说它是缺点,一个线程死掉了,其它线程也性命不保; 多个线程访问共享数据,需要昂贵的同步开销,也容易造成同步相关的BUG。

对TLS进行操作的的四个函数

(1)TlsAlloc  

DWORD TlsAlloc(void); // 返回一个TLS索引

每个线程创建时系统给它分配一个LPVOID指针的数组(叫做TLS数组,长度为TLS_MINIMUM_AVAILABLE),TlsAlloc()函数的作用是返回访问当前线程的TLS数组的一个下标(索引),不同线程得到不同的索引变量值。

当调用TlsAlloc的时候,系统会挨个检查这个数组中成员的值,直到找到一个值为FREE的成员。把找到的成员的值由FREE改为INUSE后,TlsAlloc函数返回该成员的索引。如果不能找到一个值为FREE的成员,TlsAlloc函数就返回TLS_OUT_OF_INDEXES(在WinBase.h文件中定义为-1) 

(2)TlsSetValue

BOOL TlsSetValue(

DWORD dwTlsIndex,     // TLS 索引

LPVOID lpTlsValue                   // 要设置的值

);  

将参数lpTlsValue指定的值放入索引为dwTlsIndex的线程数组成员中,调用成功,会返回TRUE。

(3)TlsGetValue 

LPVOID TlsGetValue(DWORD dwTlsIndex );       // TLS索引 

先检查TLS 索引值合法与否,如果合法,取得线程数组中索引为dwTlsIndex的成员的值。  

(4)TlsFree  

释放局部存储索引。

代码

//TLS索引,作全局变量  
DWORD  g_dwTlsIndex;
//得到TLS索引     
g_dwTlsIndex = ::TlsAlloc();
//放入数据
DWORD dwStartTime = GetTickCount();     
::TlsSetValue(g_dwTlsIndex,(LPVOID)dwStartTime);
//读出数据
DWORD dwStartTime = (DWORD)::TlsGetValue(g_dwTlsIndex); 
//释放TLS     
::TlsFree(g_dwTlsIndex);  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值