美文网首页
Linux线程私有数据

Linux线程私有数据

作者: 0X7C00 | 来源:发表于2018-07-16 21:39 被阅读0次

问题:

当把未线程化的程序转变成线程化时,当一些函数使用静态/全局变量时会出现一些问题,使用静态/全局变量的目的无非是想保存该变量的值,然而在多线程的环境下静态/全局变量无法为每一个线程保存一个值。

解决办法:

使用Linux线程私有数据

每一个线程都有一个称之为Pthread的结构,该结构中除了保存了线程的基本信息外,还有128(POSIX要求至少这么多)个key,以及每一个key所对应一个value。这个value其实是一个地址,该地址由用户使用molloc系列的函数获取,在初始情况下,各个key所对应的value都是NULL。

当一个线程想使用私有数据的时候需要调用函数pthread_create_key来创建一个key,该key为最小的未使用的key,创建key的时候Linux使用了一种一键多值的技术,一键指的是
使用pthread_create_key创建的键,该键在多个线程中是公共的,多值指的是该键在不同的线程中对应的value是不一样的。

对于一个给定的key只能创建一次,即pthread_create_key函数针对给定的键只能被调用一次,这个功能有pthread_once来保证。

可以使用pthread_getspecific和pthread_setspecific来获取和设置给定键的值。

key所对应的value通常是调用malloc函数分配的地址,在进程结束的时候,这些动态分配的内存会被回收吗?
会的,在pthread_create_key的时候会传入针对该内存的析构函数,当线程退出的时候,会自动调用析构函数,来释放动态分配的内存。

最后,为了保持内容的完整行,还需介绍一个函数,该函数的目的是取消key和value的联系

int pthread_delete(pthread_key_t *keyp);

注意调用pthread_delete不会激活与键关联的析构函数。删除线程私有数据键的时候,不会影响任何线程对该键设置的线程私有数据值,甚至不影响调用线程当前键值,所以容易造成内存泄露(因为键不与私有数据关联了,当线程正常退出的时候不会调用键的析构函数,最终导致线程的私有数据这块内存没有释放)。使用已经删除的私有数据键将导致未定义的行为。

相关文章

  • Linux线程私有数据

    问题: 当把未线程化的程序转变成线程化时,当一些函数使用静态/全局变量时会出现一些问题,使用静态/全局变量的目的无...

  • Linux 线程私有数据

    原理 一键多值,所有线程都通过一个公用的键去访问,但是访问到的是不同的值 对于线程来说其私有数据可以当做全局变量去...

  • APUE读书笔记-12线程控制(4)

    6、线程特定数据 这里的线程特定数据也就是线程私有数据,是一种只存取指定线程相关的数据的一种机制。使用线程私有数据...

  • jvm的一些笔记

    jvm内存模型 一. 线程私有区域 线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束而创建/销毁(在...

  • java面试题 --- JVM之体系结构

    1. JVM 由哪些区域构成?由类加载器和运行时数据区构成;运行时数据区又分为线程私有和线程共享两大区域,线程私有...

  • volatile关键字和synchronized的区别

    java的线程抽象内存模型中定义了每个线程都有一份自己的私有内存,里面存放自己私有的数据,其他线程不能直接访问,而...

  • 线程特定数据

    Linux多线程实践(4) --线程特定数据 1. 线程特定数据是什么? 单线程 C 程序有两类基本数据:局部数据...

  • 关于安卓进阶面试题

    ThreadLocal作用以及原理? ThreadLocal用于实现在不同的线程中存储线程私有数据的类。在多线程的...

  • 终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLoc

    什么是ThreadLocal ThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数据...

  • 浅析 ThreadLocal (Android)

    一. ThreadLocal 是什么 ThreadLocal用于实现在不同的线程中存储线程私有数据的类,通过它可以...

网友评论

      本文标题:Linux线程私有数据

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