pthread_setspecific(key,(void *)tsd);
相当于key=tsd。让别的函数也可以用到tsd的值。如果我们在线程中用到全局变量,但是只是这个全局变量key,但是每个线程都有他的独立空间,虽然key名字一样,但是存储的空间是不一样,做到每个线程对这个全局变量互不影响。这个全局空间的大小是(void *)类型,也就是4个字节空间。
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
pthread_key_t key;
void test_xiayu(void)
{
printf(" test thread %p returns %d\n",pthread_self(),pthread_getspecific(key));
}
void * thread2(void *arg)
{
int tsd = 5;
printf("thread2 %p is running\n",pthread_self());
pthread_setspecific(key,(void *)tsd);/* 将tsd值为5设置到key中*/
tsd=7;
//printf("thread2 %p returns %d\n",pthread_self(),pthread_getspecific(key));
test_xiayu();
return NULL;
}
void * thread1(void *arg)
{
int tsd = 0;
pthread_t thid2;
printf("thread1 %p is running \n",pthread_self());
pthread_setspecific(key,(void *)tsd);/*将tsd值为 0设置到key中*/
pthread_create(&thid2,NULL,thread2,NULL);
sleep(2);
test_xiayu();
//printf("thread1 %p returns %d\n",pthread_self(),pthread_getspecific(key));
return NULL;
}
void test1()
{
pthread_t thid1;
printf("main thread begins running\n");
pthread_key_create(&key,NULL);
pthread_create(&thid1,NULL,thread1,NULL);
sleep(3);
pthread_key_delete(key);
printf("main thread exit\n");
}
int main(int argc, char **argv)
{
#if 1
test1();
#endif
return 0;
}
/**
* * 主线程创建了线程thread1,线程thread1创建了thread2.两个线程分别将tsd作
* * 为线程私有数据。从程序运行结果可以看出,两个线程tsd的修改互不干扰,可
* * 以看出thread2先于thread1结束,线程在创建thread2后,睡眠5秒等待thread2
* * 执行完毕。可以看出thread2对tsd的修改并没影响到thread1的tsd的取值.
* */