线程特定数据

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

以上是关于线程特定数据的主要内容,如果未能解决你的问题,请参考以下文章

需要对特定 R 代码片段的解释

特定片段中的 Snackbar

append() 在这个代码片段中是如何工作的?与特定变量混淆[重复]

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

android在特定片段中隐藏工具栏

text [检查特定的数据片段]取自论文但有意思应用。 #python #pandas