首页 > 代码库 > 线程特定数据
线程特定数据
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]关联的指针可以指向各自的数据。
线程特定数据
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。