码迷,mamicode.com
首页 > 编程语言 > 详细

线程特定数据

时间:2016-09-16 21:09:16      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:

 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]关联的指针可以指向各自的数据。

线程特定数据

标签:

原文地址:http://www.cnblogs.com/lijinping/p/5877191.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!