线程局部存储-TLS

14 篇文章 0 订阅
5 篇文章 0 订阅

本文的最新地址http://exbrowser.com/?p=511


1.什么是线程局部存储

众所周知,线程是执行的单元,同一个进程内的多个线程共享了进程的地址空间,线程一般有自己的栈,但是如果想要实现某个全局变量在不同的线程之间取不同的值,而且不受影响。一种办法是采用线程的同步机制,如对这个变量的读写之处加临界区或者互斥量,但是这是以牺牲效率为代价的,能不能不加锁呢?线程局部存储就是干这个的。

 

2.Win32实现

Windows中是根据线程局部存储索引来标识的(这个标识的分配和释放由TlsAlloc和TlsFree完成),有了个这个”标识“就可以在各个线程中调用TlsGetValue或者TlsSetValue读取或者设置各线程各自的值;

DWORD TlsAlloc(void); 
BOOL TlsFree(DWORD dwTlsIndex); 

LPVOID TlsGetValue(DWORD dwTlsIndex); 
BOOL TlsSetValue(DWORD dwTlsIndex,  LPVOID lpTlsValue); 

小细节:
线程局部存储信息存在PE文件的.tls节中。

3.Posix实现

与Windows类似,此处的key的作用就相当于上面的dwtlsIndex。
int   pthread_key_create(pthread_key_t * key, void (*)(void *));
int   pthread_key_delete(pthread_key_t);
void *pthread_getspecific(pthread_key_t);
int   pthread_setspecific(pthread_key_t, const void *);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值