windows核心编程-线程的TLS

本文介绍了TLS(ThreadLocalStorage)的概念及其两种实现方法——关键字法和API法,并探讨了其在多线程环境下如何有效避免全局变量竞争的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TLS:Thread Local Storage 线程本地存储

本质:对于一些全局变量,为每一个线程分配一个实例,各线程只使用自己的实例,而不用去争抢那一个全局变量的实例

TLS的真实一亿在于不用为每个线程去定义一个全局匾蛉,而使用特殊关键字或者API自动为每个线程实例分配私有的全局变量,

这对一些特殊算法非常有意义,尤其是在预先不知道到底又多少线程要运行的情况下


关键字法:

__declspec(thread) int tls_i=1;

动态API的方法:

1、使用TlsAlloc函数为每个全局变量分配一个TLS索引(该索引在整个进程中唯一,对于所有线程来说同一个索引代表相同含义

的全局变量);

注:相当于为每个线程使用_beginthreadex为线程分配了一个_tiddata内存块,同时结束的时候和_endthreadex相搭配

DWORD dwTlsIndex=TlsAlloc();

2、使用TlsSetValue将该线程的值放入到对应索引的全局变量,替代直接存值在全局变量的操作

TlsSetValue(dwTlsIndex,pAnyData);

3、使用TlsGetValue从指定索引处取出该线程之前存入的值

pAnyData=TlsGetValue(dwTlsIndex)

4、使用TlsFree释放TLS的索引

TlsFree(dwTlsIndex)


关键字法以来于VC++编译器,而API方法则可以在任何可以调用API的语言环境中可用

相对来说关键字法更易于理解和使用适合改造一些以来全局变量的非多线程安全的库。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值