阅读记录——线程局部存储
2016-07-31 本文已影响245人
eesly_yuan
what?
TLS
thread local storage
TSD
thread special data
TLS/TSD算是从一个新的作用域定义一种变量存储类型,即该变量在线程的作用域上进行隔离,不同的线程的该类型变量相互隔离\独立。
why?
多线程下线程安全通常采用以下两种方式
1、如果多线程间有数据同步需求,通常采用全局变量+锁机制
2、如果线程间处理数据相互独立,线程内数据处理通常采用局部变量,或者通过传参的方式(实际也是局部变量)。
针对第2种情况,有时候线程处理数据增加时,通常需要改接口,添加参数(或者是接口设计不好),采用TLS/TSD可以避免这种问题,线程处理函数内部是数据可以通过TLS/TSD进行传递,避免修改接口通过传参数,同时又可以实现各个线程间数据隔离。
how?
/*不论哪个线程调用pthread_key_create(),所创建的key都是所有线程可访问的,
但各个线程可根据自己的需要往key中填入不同的值,这就相当于提供了一个同名
而不同值的全局变量*/
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
/*pthread_key_delete并不检查当前是否有线程正使用该key,也不会调用清理函
数(destr_function),而只是将该key释放以供下一次调用pthread_key_create()
使用*/
int pthread_key_delete(pthread_key_t key);
void *pthread_getspecific(pthread_key_t key);
int pthread_setspecific(pthread_key_t key, const void *value);
example demo for tls
more
TLS/TSD实现机制,转自http://blog.csdn.net/cywosp/article/details/26469435
进程级别的全局数组,用于存放线程局部存储的键值信息
pthread_key_create()返回的pthread_key_t类型值只是对全局数组的索引,该全局数组标记为pthread_keys,其格式大概如下,(数组的每个元素都是一个包含两个字段的结构,第一个字段标记该数组元素是否在用,第二个字段用于存放针对此键、线程局部存储变的解构函数的一个副本,即destructor函数。)
每个线程设置一个数组,存储每个线程的特有数据块的指针(通过调用pthread_setspecific()函数来存储的指针,即参数中的value)大多数都类似于下图的实现。