学习muduo库(8)之线程本地存储类ThreadLocal

 

预备知识:

int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));

第一个参数为指向一个键值的指针,第二个参数指明了一个destructor函数,如果绑定的函数不为空,那么当每个线程结束时,系统将调用这个函数来释放绑定在这个键上的内存块。key一旦被创建,所有线程都可以访问它,但各线程可根据自己的需要往key中填入不同的值,这就相当于提供了一个同名而不同值的全局变量,一键多值。

int pthread_setspecific(pthread_key_t key,const void *pointer));
void *pthread_getspecific(pthread_key_t key);

set是把一个变量的地址告诉key,一般放在变量定义之后,get会把这个地址读出来,然后你自己转义成相应的类型再去操作,注意变量的有效期。
只不过,在不同的线程里可以操作同一个key,他们不会冲突,比如线程a,b,c set同样的key,分别get得到的地址会是之前各自传进去的值。
这样做的意义在于,可以写一份线程代码,通过key的方式多线程操作不同的数据。

int pthread_setspecific(pthread_key_t key, const void *value);该函数将value的值(不是内容)与key相关联。用pthread_setspecific为一个键指定新的线程数据时,线程必须先释放原有的线程数据用以回收空间。

nt pthread_key_delete(pthread_key_t key);用来删除一个键,删除后,键所占用的内存将被释放。注销一个TSD,这个函数并不检查当前是否有线程正使用该TSD,也不会调用清理函数(destr_function),

而只是将TSD释放以供下一次调用pthread_key_create()使用。需要注意的是,键占用的内存被释放。与该键关联的线程数据所占用的内存并不被释放。因此,线程数据的释放,必须在释放键之前完成。

UML:

学习muduo库(8)之线程本地存储类ThreadLocal_第1张图片

解释:

在主线程中生成ThreadLocal对象后,每一个线程都可以使用它,而且对应的值还都不一样,真实功能强大。

在刚看这个源码的时候,我发现这个这个类只有value()这个方法来查看值,但是却没有提供方法去设置这个值,感觉十分奇怪。看了测试例子之后,才知道是怎么用的。因为value()返回的是引用,可以通过这个引用来対生成的对象进行设置。这也就要就这个对象初始化时必须可以无参初始化。

 

 

 

 

你可能感兴趣的:(学习muduo库)