//deepfuture.iteye.com 深未来技术 #include <pthread.h> #include <stdio.h> struct mydata{ int x; char c[4]; }; pthread_t pthreada,pthreadb; pthread_key_t datakey;//每个进程创建一次,不同的线程,同样名字的键指向不同的地方 //deepfuture.iteye.com 深未来技术 void *cleanup_mydata(void *dataptr){//删除键时调用的 free((struct mydata*)dataptr); } void anum1(){ int rc; struct mydata *mdata=(struct mydata*)malloc(sizeof(struct mydata)); mdata->x=1; mdata->c[0]='a'; mdata->c[1]='\0'; rc=pthread_setspecific(datakey,(void*)mdata);//设置键指向的值,注意这个mdata为值的内存,必须使用指针的方式指向内存 sleep(1); struct mydata *mmdata=(struct mydata*)pthread_getspecific(datakey);//取出键指向的值,注意这个mdata为值的内存,必须使用指针的方式指向内存 printf("-%d-%s\n",mmdata->x,mmdata->c); //deepfuture.iteye.com 深未来技术 fflush(stdout); } void bnum2(){//deepfuture.iteye.com 深未来技术 int rc; struct mydata *mdata=(struct mydata*)malloc(sizeof(struct mydata)); mdata->x=2; mdata->c[0]='b'; mdata->c[1]='\0'; rc=pthread_setspecific(datakey,(void*)mdata);//设置键指向的值,注意这个mdata为值的内存,必须使用指针的方式指向内存 sleep(1); struct mydata *mmdata=(struct mydata*)pthread_getspecific(datakey);//取出键指向的值,注意这个mdata为值的内存,必须使用指针的方式指向内存 printf("-%d-%s\n",mmdata->x,mmdata->c); fflush(stdout); } int main(void){ int rc; rc=pthread_key_create(&datakey,cleanup_mydata);//为键删除时的清理函数 pthread_create(&pthreada,NULL,anum1,NULL); pthread_create(&pthreadb,NULL,bnum2,NULL); sleep(3);//deepfuture.iteye.com 深未来技术 pthread_join(pthreada,NULL); pthread_join(pthreadb,NULL); rc=pthread_key_delete(datakey); //仅删除键,但不删除值指向的内存,线程终止调用用户自定义的删除函数,本例中为cleanup_mydata }