在多线程程序中,所有线程共享程序中的变量。Linux
有一全局变量,所有线程都可以使用它,改变它的值。如果每个线程希望能单独拥有它,那么就需要使用线程存储了。表面上看起来这是一个全局变量,所有线程都可以使用它,但它的值在每一个线程中又是单独存储的。
线程存储的具体用法:
创建一个类型为
pthread_key_t
类型的变量。调用
pthread_key_create()
来创建该变量,该函数有两个参数,第一个参数就是上面声明的pthread_key_t
变量,第二个参数是一个清理函数,用来在线程释放该线程存储的时候被调用,该函数指针可以设成NULL
,这样系统将调用默认的清理函数;当线程中需要存储特殊值的时候,可以调用
pthread_setspcific()
,该函数有两个参数,第一个为前面声明的pthread_key_t
变量,第二个为void*
变量,这样可以存储任何类型的值;如果需要取出所存储的值,调用
pthread_getspecific()
,该函数的参数为前面提到的pthread_key_t
变量,该函数返回void*
类型的值;注销使用
pthread_key_delete()
函数,该函数并不检查当前是否有线程正在使用,也不会调用清理函数,而只是释放以供下一次调用pthread_key_create()
使用。
下面是前面提到的函数原型:
int pthread_setspecific(pthread_key_t key, const void *value);
void* pthread_getspecific(pthread_key_t key);
int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
int pthread_key_delete(pthread_key_t *key);
线程存储例子:
#include <pthread.h>
#include <stdio.h>
static pthread_key_t thread_key;
void* thread_function(void* args)
{
pthread_t spid = pthread_self();
pthread_setspecific(thread_key, (void *)spid);
pthread_t gpid = (pthread_t)pthread_getspecific(thread_key);
printf("set: %lu, get: %lu, %s\n", spid, gpid, (spid == gpid ? "equal":"not equal"));
return NULL;
}
int main(int argc, char** argv)
{
int i;
pthread_t threads[5];
pthread_key_create(&thread_key, NULL);
for (i = 0; i < 5; ++i) {
pthread_create(&(threads[i]), NULL, thread_function, NULL);
}
for (i = 0; i < 5; ++i) {
pthread_join(threads[i], NULL);
}
pthread_key_delete(thread_key);
return 0;
}
参考文章
pthread_key_t和pthread_key_create()的使用
Linux多线程学习(三)pthread_key_create