加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_新乡站长网 (https://www.0373zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux线程私有数据

发布时间:2023-02-16 13:41:51 所属栏目:Linux 来源:
导读:  问题:

  当把未线程化的程序转变成线程化时,当一些函数使用静态/全局变量时会出现一些问题,使用静态/全局变量的目的无非是想保存该变量的值,然而在多线程的环境下静态/全局变量无法为每一个线程保存一
  问题:
 
  当把未线程化的程序转变成线程化时,当一些函数使用静态/全局变量时会出现一些问题,使用静态/全局变量的目的无非是想保存该变量的值,然而在多线程的环境下静态/全局变量无法为每一个线程保存一个值。
 
  解决办法:
 
  使用Linux线程私有数据
 
  每一个线程都有一个称之为Pthread的结构,该结构中除了保存了线程的基本信息外,还有128(POSIX要求至少这么多)个key,以及每一个key所对应一个value。这个value其实是一个地址,该地址由用户使用molloc系列的函数获取,在初始情况下,各个key所对应的value都是NULL。
 
  当一个线程想使用私有数据的时候需要调用函数pthread_create_key来创建一个key,该key为最小的未使用的key,创建key的时候Linux使用了一种一键多值的技术,一键指的是
 
  使用pthread_create_key创建的键,该键在多个线程中是公共的linux 线程,多值指的是该键在不同的线程中对应的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不会激活与键关联的析构函数。删除线程私有数据键的时候,不会影响任何线程对该键设置的线程私有数据值,甚至不影响调用线程当前键值,所以容易造成内存泄露(因为键不与私有数据关联了,当线程正常退出的时候不会调用键的析构函数,最终导致线程的私有数据这块内存没有释放)。使用已经删除的私有数据键将导致未定义的行为。
 

(编辑:开发网_新乡站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!