线程局部存储区(TLS)-之我见

本文深入探讨了Windows系统中线程局部存储(TLS)的工作机制,包括其核心的数据结构——全局索引数组和线程指针数组,以及TLS的主要函数TlsAlloc、TlsSetValue、TlsGetValue和TlsFree的功能。通过实例,如strtok()多线程版本和GetLastError(),展示了TLS在解决多线程数据隔离问题中的应用。

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

(1)TLS的机制原理

     主要的数据结构就是两个,一个就是进程范围的全局索引数组,再一个就是线程范围的指针数组。这两个数组的大小是一样的,ms保证这两个数组的大小至少为TLS_MINIMUM_AVAILABLE。全局索引数组只是用来保存索引,也就是整型数据,指针数组只是用来保存指针。当某个进程的某个线程需要使用TLS时,就从全局索引数组申请一个索引号,这个索引号在被释放之前就不能被其他线程申请到了。这个索引号一般来都是用进程级别的全局变量来保存的,所以这个索引号对进程中的所有线程都是可见的,可访问的。只要某一个线程申请到了索引号i,那么进程内的所有线程的指针数组的相应位置i就被标记为占用。好了,现在进程中的每个线程就可以使用这个索引号i来向线程的指针数组的第i个位置传递各自所需的数据(实际上是数据指针,这个指针一般指向线程栈而不是全局堆)了,数据传递完毕后,线程就可以用这个索引号i来访问到自己之前设定的数据。也就是说,现在,进程中的所有线程都使用相同的索引号i来访问TLS数据,但却访问的并不是相同的数据,而是各个线程自己设定的数据。

(2)函数调用

    DWORD TlsAlloc()  从全局索引数组申请一个索引号。

    BOOL TlsSetValue(DWORD Index,PVOID pValue)  向指针数组索引号为Index的位置传入数据指针。

    PVOID TlsGetValue(DWORD Index)  获取指针数组索引号为Index的位置的数据指针,然后把返回值解指针*就可以。

    VOID TlsFree(DWORD Index));  向全局索引数组返还索引号,即把Index标记为未使用。

(3)实例

     常见的 strtok() 多线程版本,就是使用了TLS,以及windows 函数 GetLastError()也是如此。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值