标签:
在多线程程序中,经常要用全局变量来实现多个函数间的数据共享。由于数据空间是共享的,因此全局变量也为所有线程共有。
测试代码如下:
由运行结果可以看出,其中一个线程对全局变量的修改将影响到另一个线程的访问。
但有时应用程序设计中必要提供线程私有的全局变量,这个变量仅在线程中有效,但却可以跨过多个函数访问。比如在程序里可能需要每个线程维护一个链表,而会使用相同的函数来操作这个链表,最简单的方法就是使用同名而不同变量地址的线程相关数据结构。这样的数据结构可以由 Posix 线程库维护,成为线程私有数据 (Thread-specific Data,或称为 TSD)。
下面接口所需头文件:
#include <pthread.h>
1)创建线程私有数据
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
功能:
创建一个类型为 pthread_key_t 类型的私有数据变量( key )。
参数:
key:在分配( malloc )线程私有数据之前,需要创建和线程私有数据相关联的键( key ),这个键的功能是获得对线程私有数据的访问权。
destructor:清理函数名字( 如:fun )。当线程退出时,如果线程私有数据地址不是非 NULL,此函数会自动被调用。该函数指针可以设成 NULL ,这样系统将调用默认的清理函数。
回调函数其定义如下:
void fun(void *arg)
{
// arg 为 key 值
}
返回值:
成功:0
失败:非 0
不论哪个线程调用 pthread_key_create(),所创建的 key 都是所有线程可访问,但各个线程可根据自己的需要往 key 中填入不同的值,相当于提供了一个同名不同值的变量。
2)注销线程私有数据
int pthread_key_delete(pthread_key_t key);
功能:
注销线程私有数据。这个函数并不会检查当前是否有线程正使用线程私有数据( key ),也不会调用清理函数 destructor() ,而只是将线程私有数据( key )释放以供下一次调用 pthread_key_create() 使用。
参数:
key:待注销的私有数据。
返回值:
成功:0
失败:非 0
3)设置线程私有数据的关联
int pthread_setspecific(pthread_key_t key, const void *value);
功能:
设置线程私有数据( key ) 和 value 关联,注意,是 value 的值(不是所指的内容)和 key 相关联。
参数:
key:线程私有数据。
value:和 key 相关联的指针。
返回值:
成功:0
失败:非 0
4)读取线程私有数据所关联的值
void *pthread_getspecific(pthread_key_t key);
功能:
读取线程私有数据( key )所关联的值。
参数:
key:线程私有数据。
返回值:
成功:线程私有数据( key )所关联的值。
失败:NULL
示例代码如下:
从运行结果来看,各线程对自己的私有数据操作互不影响。也就是说,虽然 key 是同名且全局,但访问的内存空间并不是同一个。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/lianghe_work/article/details/47747241