线程特定数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程特定数据相关的知识,希望对你有一定的参考价值。
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]关联的指针可以指向各自的数据。
以上是关于线程特定数据的主要内容,如果未能解决你的问题,请参考以下文章
append() 在这个代码片段中是如何工作的?与特定变量混淆[重复]
newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段