• 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]='';
    36 
    37     rc=pthread_setspecific(dataKey,(void*)mdata);//设置键指向的值,注意这个mdata为值的内存,必须使用指针的方式指向内存 
    38     sleep(1);
    39     Data *mmdata=(Data*)pthread_getspecific(dataKey);//取出键指向的值,注意这个mdata为值的内存,必须使用指针的方式指向内存 
    40     printf("-%d-%s
    ",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]='';
    53 
    54     rc=pthread_setspecific(dataKey,(void*)mdata);//设置键指向的值,注意这个mdata为值的内存,必须使用指针的方式指向内存 
    55     sleep(1);
    56     Data *mmdata=(Data*)pthread_getspecific(dataKey);//取出键指向的值,注意这个mdata为值的内存,必须使用指针的方式指向内存 
    57     printf("-%d-%s
    ",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 }

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

  • 相关阅读:
    servlet中Cookie的编码问题
    servlet关于转发用法
    eclipse界面更改为黑色
    猜字符小游戏——可以设置等级
    uva 10655
    uva11029
    UVA11388 GCD LCM1 2 -1
    uva 11609
    poj 2436
    poj 2431
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/14003288.html
Copyright © 2020-2023  润新知