Linux下多线程编程之——线程专有数据

  每个线程都有自己的专有数据,私有数据采用的是公有键私有值的存储方式,通过键来访问值的方式访问数据。以线程看来,访问就是使用公有键指代线程数据;貌似对键的取值和对变量的访问是一样的。其实,公有键的私有值的访问方式和面向对象中的多态很相似,不同线程中,同样的键实际指向的是不同的内存内容。

一、操作线程私有数据的函数

  1、pthread_key_create()用于创建一个键;

  2、pthread_setspecific()将私有数据存储进与键值对应的位置

  3、pthread_getspecific()将私有数据从存储位置去除

  4、pthread_key_delete()用于删除键

二、代码test7_9.c

 1 //This is c program code!
 2 /* *=+=+=+=+* *** *=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
 3   * 文档信息: *** :~/test7_9.c
 4   * 版权声明: *** :(魎魍魅魑)MIT
 5   * 联络信箱: *** :guochaoxxl@163.com
 6   * 创建时间: *** :2020年11月18日的上午09:17
 7   * 文档用途: *** :数据结构与算法分析-c语言描述
 8   * 作者信息: *** :guochaoxxl(http://cnblogs.com/guochaoxxl)
 9   * 修订时间: *** :2020年第46周 11月18日 星期三 上午09:17 (第323天)
10   * 文件描述: *** :自行添加
11  * *+=+=+=+=* *** *+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+*/
12 #include <pthread.h>
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <unistd.h>                                                                                                                                                                                                                                                          
16 
17 typedef struct _data{
18        int x;
19        char c[4];
20 } Data;
21 
22 pthread_t pthreadA;
23 pthread_t pthreadB;
24 pthread_key_t dataKey;//每个进程创建一次,不同的线程,同样名字的键指向不同的地方
25 
26 void *cleanup_myData(void *dataptr){//删除键时调用的
27     free((Data*)dataptr);
28 }
29 
30 void anum1(){
31     int rc;
32     Data *mdata=(Data*)malloc(sizeof(Data));
33     mdata->x=1;
34     mdata->c[0]='a';
35     mdata->c[1]='\0';
36 
37     rc=pthread_setspecific(dataKey,(void*)mdata);//设置键指向的值,注意这个mdata为值的内存,必须使用指针的方式指向内存 
38     sleep(1);
39     Data *mmdata=(Data*)pthread_getspecific(dataKey);//取出键指向的值,注意这个mdata为值的内存,必须使用指针的方式指向内存 
40     printf("-%d-%s\n",mmdata->x,mmdata->c);
41 
42     fflush(stdout);
43 
44     return;
45 }
46 
47 void bnum2(){
48     int rc;
49     Data *mdata=(Data*)malloc(sizeof(Data));
50     mdata->x=2;
51     mdata->c[0]='b';
52     mdata->c[1]='\0';
53 
54     rc=pthread_setspecific(dataKey,(void*)mdata);//设置键指向的值,注意这个mdata为值的内存,必须使用指针的方式指向内存 
55     sleep(1);
56     Data *mmdata=(Data*)pthread_getspecific(dataKey);//取出键指向的值,注意这个mdata为值的内存,必须使用指针的方式指向内存 
57     printf("-%d-%s\n",mmdata->x,mmdata->c);
58 
59     fflush(stdout);
60 
61     return;
62 }
63 
64 int main(int argc, char **argv){
65     int rc;
66 
67     rc=pthread_key_create(&dataKey,cleanup_myData);//为键删除时的清理函数
68     pthread_create(&pthreadA,NULL,anum1,NULL);
69     pthread_create(&pthreadB,NULL,bnum2,NULL);
70     sleep(3);
71     pthread_join(pthreadA,NULL);
72     pthread_join(pthreadB,NULL);
73     rc=pthread_key_delete(dataKey); //仅删除键,但不删除值指向的内存,线程终止调用用户自定义的删除函数,本例中为cleanup_mydata
74 
75     return 0;
76 }

 

  知识点都在代码中,不多说。

 

posted @ 2020-11-19 08:07  叕叒双又  阅读(178)  评论(0编辑  收藏  举报