Linux线程私有数据

问题:

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

解决办法:

使用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线程私有数据)