线程本地存储

线程本地存储(TLS)运行一个进程拥有自己的变量缓冲,保证对进程中的每个线程都是唯一的。这个变量缓冲很小,因为进程中每个线程在创建时都必然会创建一个TLS数组元素,但是如果灵活的使用,这个缓冲是足够的。具体讲,系统常数TLS_MINIMUM_AVAILABLE,定义了每个进程可以使用的TLS数组中槽的数目。在WinCE下,这个值为64,。所以每个进程拥有64个4字节变量,可以用来存储该进程中每个线程需要的唯一数据。为了得到更好的效果,当然,你必须自己管理这64个槽。

 

预留一个TLS槽,进程要调用函数:

DWORD TlsAlloc(void);TLSAlloc函数查询TLS槽的数组,找到一个可用的槽,将其标记为正在使用、并返回这个新分配的槽在数组中的索引值。如果没有可用的槽,该函数返回-1。重要的是,每个被创建的线程自身不能调用TlsAlloc,而是进程或dll,在她创建要使用这些TLS槽的线程之前调用这个函数。当一个槽被分配之后,每个线程的实例可以访问它放在槽中的独立数据,通过调用下面等函数:

BOOL TlssSetValue(DWORD dwTlsIndex,LPVOID lpTlsValue);

和LPVOID TlsGetValue(DWORD dwTlsIndex);

 

以上两个函数,TlsAlloc函数返回的TLS槽索引值指定了存放数据的槽,函数get和set的数据类型都是LPVOID,这个值可以用来做任何用途。将TLS值作为指针的优点就是,一个线程可以在堆中分配一块内存,并且将这块内存的指针保存在TLS值中。这样每个线程都能够维护一块大小能够自定义的线程独立数据。

线程本地存储还有一个值得注意的地方。当tlsalloc函数预留一个槽时,它将该槽的值置零,这是针对当前所有的正在运行的线程的。所有新创建线程的TLS数组值也被初始化为0。这意味着一个线程可以安全的假定它的TLS初值为0。这对一个线程在第一次调用例程时,确定自己是否要分配一块内存非常有用。

当一个进程不再需要一个TLS槽时,调用一下函数:

BOOL TlsAlloc(DWORD dwTlsIndex);

该函数传入需要释放的槽的索引值。该函数只释放槽,如果线程在堆中分配内存,并且将内存指针放在TLS槽中,该函数释放TLS槽中指针指向的内存。由线程负责释放它们自己申请的内存。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值