在多线程程序中,所有线程共享程序中的变量。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#include 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;}