TLS(Thread Local Storage)线程本地存储

本文介绍了TLS(Thread Local Storage)的概念,重点讲解了Windows环境下通过TlsAlloc、TlsSetValue、TlsGetValue和TlsFree四个函数实现线程本地存储的过程。TLS允许每个线程在同一个存储空间中拥有独立的副本,提高多线程并行度。

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

        最近开始看些多线程设计。总体觉得,如果只是单单想达到多线程安全的目的,通过加锁很容易实现。多线程的难点在于,如何实现最大的并行度,即如何确定加锁区段,使尽可能多的线程可以工作,而不是简单的给一个大函数整个加锁。

        其中提到过TLS,线程本地存储。windows的实现关联到4个函数:

(1)TlsAlloc

          返回一个index,标示一个存储空间。一个存储空间包含64个存储单元。即一个index,可以对应64个线程使用自己的副本。

(2)TlsSetValue 

         通过index,可以设置和本线程相关的存储单元。

(3)TlsGetValue

         通过index,可以得到和本线程相关的存储单元 。

(4)TlsFree  

        通过index,释放一个存储空间。


具体的用法:

1,在main函数中通过 TlsAlloc 来分配一个存储空间,返回值index,把index会存储在一个全局变量中,供各个线程使用。


2,在线程函数里面,通过TlsSetValue( index, value ),把value设置到存储空间,对应的存储单元里面。对不同的线程,大家用的是同一个存储空间,这个存储空间通过index来显示的指示,但是存在哪个存储单元中,由各个线程自己隐式标示。

          线程1自己说,存储到 index里面,

         线程2自己说,存储到 index里面,

         线程3自己说,存储到 index里面,

内部而已,每个线程占用同一个存储空间,但是会占用不同的存储单元。


3,在线程函数内,通过TlsGetValue(index)得到线程自己的value。

        线程1自己说,获取index里面的值,

         线程2自己说,获取index里面的值,

         线程3自己说,获取index里面的值,

各个线程会得到自己对应的存储单元。


4,在main函数中通过TlsFree  释放存储空间。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值