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 }
知识点都在代码中,不多说。
人就像是被蒙着眼推磨的驴子,生活就像一条鞭子;当鞭子抽到你背上时,你就只能一直往前走,虽然连你也不知道要走到什么时候为止,便一直这么坚持着。