首页 > 代码库 > 线程特定数据

线程特定数据

 1 #include <pthread.h> 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5  6  7 pthread_key_t thread_self_data_key; 8  9 void destory(void *p)10 {11     free(p);12 }13 14 void createit(void)15 {16     pthread_key_create(&thread_self_data_key,destory);17 }18 void* doit();19 void* doit2();20 21 static     pthread_once_t once_var=PTHREAD_ONCE_INIT;22 23 int main()24 {25     pthread_t pt1,pt2;26 27     pthread_create(&pt1,NULL,doit,NULL);28     pthread_create(&pt2,NULL,doit2,NULL);29 30     pthread_join(pt1, NULL);31     pthread_join(pt2, NULL);32 33     return 0;34 }35 36 37 void* doit()38 {39 //    int ret = pthread_key_create(&thread_self_data_key,destory);40 //    if( ret != 0 )41 //    {42 //        printf("ret is :%d\n",ret);43 //        printf("%s",strerror(ret));44 //        return;45 //    }46     pthread_once(&once_var, createit);47     size_t sz=10;48     void *p = malloc(sz);49 50     strcpy(p,"12345\n");51 52     pthread_setspecific(thread_self_data_key,p);53 54     int i=0;55     for(;i<5;i++)56     {57         char *q = pthread_getspecific(thread_self_data_key);58         printf("pthreadid: %d, char is: %s", pthread_self(), q);59         sleep(3);60     }61     return NULL;62 }63 64 void* doit2()65 {66 //    int ret = pthread_key_create(thread_self_data_key,destory);67 //    if( ret != 0 )68 //    {69 //        printf("ret is :%d\n",ret);70 //        printf("%s",strerror(ret));71 //        return;72 //    }73     pthread_once(&once_var, createit);74     75     size_t sz=50;76     void *p = malloc(sz);77     strcpy(p,"abcde\n");78 79     pthread_setspecific(thread_self_data_key,p);80     printf("key is************: %d\n", thread_self_data_key);81     82     int i=0;83     for(;i<5;i++)84     {85         if( i == 4 )86         {87             strcpy(p,"set new value......\n");88             pthread_setspecific(thread_self_data_key,p);89         }90         char *q = pthread_getspecific(thread_self_data_key);91         printf("pthreadid: %d, char is: %s", pthread_self(), q);92         sleep(3);93     }94     return NULL;95 }

//pthread_key_create 使用&key pthread_setspecific pthread_getspecific 直接使用key(作为pkey的索引)
//同一个key只能create一次(进程内),否则报22错误,invalid argument
//pthread_once &pthread_once_t 能保证只做一次

 

//进程内有128个key结构,每个线程有128个pkey与之对应,其原理就是每个pkey[i]关联的指针可以指向各自的数据。

线程特定数据