pthread_key多次调用pthread_key_create

pthread_key是线程私有变量,它可以使多个线程用一个全局变量,但各自持有不同的值(通过pthread_set_specific调用)。

pthread_key的使用一般是经过pthread_key_create->pthread_set_specific->pthread_key_delete这三个过程。如果pthread_key_create多次结果会怎样呢?多次pthread_key_create主要关系到私有变量和销毁函数。

根据私有变量(pram)和销毁函数(func),多次pthread_key_create分两种情况:

    (1).私有变量不变,多次绑定func 

    (2).私有变量不同,绑定不同func

体现在代码中就是这样(假定pram为1):

    (1).

void func(int *data)
{
    if (data != NULL)
        printf("key data is:%d\n", *data);
}
void func1(int *data)
{
    if (data != NULL)
        printf("key data is:%d\n", (*data) + 10);
}
pthread_key_create(&key, func);
pthread_key_create(&key, func1);
...
pthread_set_specific(key, pram);

    (2).

pthread_key_create(&key, func);
...
pthread_set_specific(key, pram);

pthread_key_create(&key, func1);
...
pthread_set_specific(key, pram);

猜猜各自运行结果怎么样?

(1)最后输出——"key data is 11"

(2)最后输出——"key data is 1"

                          "key data is 11"

 

其实pthread_key_create会做两件事。首先,它将线程私有变量置为NULL,然后置销毁函数为destroy_func。然后在线程退出时,它会判断是否有私有变量,若为NULL就不调用销毁函数。

最后附上一段可以直接运行的代码:
 

  #include <stdio.h>
  #include <stdlib.h>
  #include <pthread.h>
  
  pthread_key_t key;
  
  void destroy_func1(int *data)
  {
      if (data == NULL) {
          return;
      } else {
          printf("key data plus 10 is:%d\n", *data + 10);
          free(data);
          data = NULL;
      }
  }
  
  void destroy_func(int *data)
  {
      if (data == NULL) {
          return;
      } else {
        printf("key data is :%d\n",*data);
          free(data);
          data = NULL;
      }
  
  }
  
  void *thread_func()
  {
      int *data = NULL;
      pthread_key_create(&key, destroy_func);
      data = pthread_getspecific(key);
      if (data == NULL) {
          data = (int *)malloc(sizeof(int));
          *data = 1;
          pthread_setspecific(key, data);
      }
  
      pthread_key_create(&key, destroy_func1);
      data = pthread_getspecific(key);
      if (data == NULL) {
        data = (int *)malloc(sizeof(int));
          *data = 2;
          pthread_setspecific(key,data);
      }
  
      printf("hello world\n");
  }
  
int main(int argc, char **argv)
  {
      pthread_t pid;
      pthread_create(&pid, NULL, thread_func, NULL);
      pthread_join(pid, NULL);
      pthread_key_delete(key);  
  }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值