美文网首页
阅读记录——线程局部存储

阅读记录——线程局部存储

作者: eesly_yuan | 来源:发表于2016-07-31 20:19 被阅读245次
    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)大多数都类似于下图的实现。


    reference

    相关文章

      网友评论

          本文标题:阅读记录——线程局部存储

          本文链接:https://www.haomeiwen.com/subject/zgotsttx.html