线程特定数据TSD及其实现原理

引言:

                单线程C程序有两类基本数据:局部数据和全局数据。对于多线程C程序,添加了第三类数据:线程特定数据

        那么为什么要引入线程特定数据呢?试想如果你的一个线程里面嵌套调用了很多函数,而你又想在这些函数之间使用一个

       公共的变量,如果在单线程C中,我们是不是就要声明一个全局变量了呢?是的。但是我们想使声明的这个全局变量

       只属于我们当前这个实例线程(同一个void *(*start_routine)(void *)可以实例化很多线程),其他的线程访问不到,

       故引入线程特定数据TSD。(ps:如果我们直接声明了一个全局变量,则其他线程也有可能使用到这个变量)。


线程特定数据:

                线程特定数据与全局数据非常相似,区别在于前者为线程所有。(如果你学过面向对象编程,他们的关系就类似于

        class中静态成员与普通成员的关系。所有对象都可以访问静态成员,而每个普通对象的普通成员只能被自己这个对象

       访问)


实现:

                每一个系统支持的TSD限制都不一样。POSIX要求系统至少支持128个TSD,系统为每一个进程维护了一个称之为

        Key的数据结构数组。如下图每个TSD包含两项内容:使用标志和析构函数指针。标志:这个数组元素是否正在使用当一个

        线程调用pthread_key_create创建一个新的TSD时,系统会搜索key结构数组,找出其中一个未使用的元素,并通过key返

        回该元素的键,即我们前面所说的索引。pthread_key_create函数的第二个参数destructor是一个函数指针,指向一个析构

        函数,用于线程结束后一些后期处理。析构函数的参数就是指向TSD的指针


                除了进程范围内的key结构数组外,系统还在进程中维护关于每个线程的线程结构,把这个特定于线程的结构称为pthread

        结构,它的128个指针和进程中的128个可能的键是逐一关联的。指针指向的内存就是TSD。两者之间关系如下


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值