线程局部存储机制 TLS

线程局部存储(thread-local storage, TLS)是一个使用很方便的存储线程局部数据的系统。利用TLS机制可以为进程中所有的线程关联一个只属于本线程内可以使用的数据,线程内通过由TSL分配的全局索引来设置和访问与自己关联的数据。

用于管理TLS的数据结构很简单,Windows仅为系统中的每个进程维护一个数组,这个数组的长度至少有TLS_MINIMUM_AVAILABLE位(一般为64),数组中的每个值就是一个标志,设置为FREE或INUSE,此标志指示了对应的数组索引是否在使用中。在主线程中调用TlsAlloc函数来获取未使用的数组索引号(数组下标),并将数组中该成员的值从FREE设置为INUSE。如果没有可用的数组索引就会返回-1。

DWORD TlsAlloc(void); // 返回一个TLS索引号

当成功获取索引号后,系统将会申请一个数组空间与该索引号相对应。数组的每个成员就对应着一个线程局部存储,我们无法知道哪个成员属于哪个线程(这由系统自己分配)。我们只要使用TlsSetValue和TlsGetValue函数通过全局索引号来设置或读取与自己相关联的那个成员值就行了。

BOOL TlsSetValue(
      DWORD dwTlsIndex, // TLS 索引
      LPVOID lpTlsValue // 要设置的值
);
LPVOID TlsGetValue(DWORD dwTlsIndex); // TLS 索引

TSL只为每个线程保存了一个32位大小的数组成员作为局部数据。如果我们要保存任意类型的数据怎么办呢? 我们可以学习系统为全局索引号分配数组空间那样再申请一个数组空间,将数组的首地址保存在线程局部数据中。将数组中的每个成员看成一个槽,存放不同类型的数据指针。通过槽号索引来设置或读取数据。那样一个线程内就可以保存多个不同类型的局部变量了。这就是MFC中采用的线程局部存储技术。

最后主线调用TlsFree释放局部存储索引。

赞(0) 打赏
取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

    暂无评论...