线程私有存储空间的全局变量pthread_key_t

简介: 线程私有存储空间的全局变量pthread_key_t

一、api的使用

1.pthread_key_t key;定义一个该类型的变量,作为key,用来对应线程的私有存储空间的value

2.pthread_key_create(&key, NULL);创建(初始化)变量key,使它能够区别不同线程中,这个key所对应的value

3.pthread_setspecific(key, &i);在线程中,通过全局变量key,将值传入线程的私有空间中

4.int *p = (int *)pthread_getspecific(key);在线程中,通过全局变量key,将线程的私有空间中的值取出来。

看似是全局变量,然而全局的只是key值,对于不同的线程对应的value值是不同的(通过pthread_setspcific()和pthread_getspecific()设置),key对每个线程中的value都能进行绑定与识别。

一个全局变量key,每个线程对应 特定的指针void*。

由于pthread_setspecific第二个参数是void*, 因此可以传入任意类型的值,如int,字符,结构体等。

总之,全局变量key,在不同线程中对应的value是不一样的。

二、案例

#include<pthread.h>
#include<stdio.h>
#define THREAD_COUNT 3
pthread_key_t key;
typedef void *(*thread_cb)(void *);
void print_thread1_key(void) {
  int *p = (int *)pthread_getspecific(key);//将值从私有空间中取出来
  printf("thread 1 : %d\n", *p);
}
//线程1 的回调函数
void *thread1_proc(void *arg) {
  int i = 5;  
  pthread_setspecific(key, &i);//将 i传入私有空间中
  print_thread1_key();
}
void print_thread2_key(void) {
  char *ptr = (char *)pthread_getspecific(key);
  printf("thread 2 : %s\n", ptr);
}
//线程2 的回调函数
void *thread2_proc(void *arg) {
  char *ptr = "thread2_proc";
  pthread_setspecific(key, ptr);
  print_thread2_key();
}
struct pair {
  int x;
  int y;
};
void print_thread3_key(void) {
  struct pair *p = (struct pair *)pthread_getspecific(key);
  printf("thread 3  x: %d, y: %d\n", p->x, p->y);
}
//线程3 的回调函数
void *thread3_proc(void *arg) {
  struct pair p = {1, 2};
  pthread_setspecific(key, &p);
  print_thread3_key();
}
int main(){
    pthread_t thid[THREAD_COUNT] = {0};//3个线程id
    pthread_key_create(&key, NULL);//创建key,这个全局变量可以认为是线程内部的私有空间
    thread_cb callback[THREAD_COUNT] = {//线程的回调函数
    thread1_proc,
    thread2_proc,
    thread3_proc
  };
  int i = 0;int count = 0;
  for (i = 0;i < THREAD_COUNT;i ++) {//创建线程
    pthread_create(&thid[i], NULL, callback[i], &count);
  }
  for (i = 0;i < THREAD_COUNT;i ++) {
    pthread_join(thid[i], NULL);//主线程需要等待子线程执行完成之后再结束
  }
}


相关文章
|
6月前
|
缓存 安全 Java
为什么全局变量可能成为多线程环境中的安全隐患
为什么全局变量可能成为多线程环境中的安全隐患
|
安全 调度 Python
【从零学习python 】80.线程访问全局变量与线程安全问题
【从零学习python 】80.线程访问全局变量与线程安全问题
98 0
|
安全 Python
【从零学习python 】79. 线程访问全局变量与线程安全问题
【从零学习python 】79. 线程访问全局变量与线程安全问题
84 0
|
NoSQL 安全 Java
案例15-ArrayList线程不安全,共用全局变量导致数据错乱问题,占用内存情况
案例15-ArrayList线程不安全,共用全局变量导致数据错乱问题,占用内存情况
|
Python
【Python零基础入门篇 · 32】:资源共享、全局变量和资源竞争,线程的同步,执行的任务有参数
【Python零基础入门篇 · 32】:资源共享、全局变量和资源竞争,线程的同步,执行的任务有参数
131 0
【Python零基础入门篇 · 32】:资源共享、全局变量和资源竞争,线程的同步,执行的任务有参数
|
索引 Python
python 线程 ~~ ~~~为面试开辟VIP通道~~~~~测试、死锁、全局变量共享、守护主线程等。。。。。。(2)
python 线程 ~~ ~~~为面试开辟VIP通道~~~~~测试、死锁、全局变量共享、守护主线程等。。。。。。(2)
143 0
python 线程 ~~ ~~~为面试开辟VIP通道~~~~~测试、死锁、全局变量共享、守护主线程等。。。。。。(2)
|
存储 JSON 资源调度
python 线程 ~~ ~~~为面试开辟VIP通道~~~~~测试、死锁、全局变量共享、守护主线程等。。。。。。(1)
线程(英语:thread)是操作系统能够进行运算调度的最小单位。线程很重要,通过本篇文章可以让你们很好的了解线程的传参、线程执行规则、守护主线程、线程间共享全局变量、进程互斥锁、死锁进程怎么解决。希望对你们有所帮助。
232 0
python 线程 ~~ ~~~为面试开辟VIP通道~~~~~测试、死锁、全局变量共享、守护主线程等。。。。。。(1)
|
开发者 Python
多线程共享全局变量&amp;线程安全问题| 学习笔记
快速学习多线程共享全局变量&amp;线程安全问题
|
安全 调度 Python
3_python高阶_线程—多线程-共享全局变量
python高阶_线程—多线程-共享全局变量
277 0
|
存储 Java Android开发
【Android NDK 开发】JNI 线程 ( JNI 线程创建 | 线程执行函数 | 非 JNI 方法获取 JNIEnv 与 Java 对象 | 线程获取 JNIEnv | 全局变量设置 )
【Android NDK 开发】JNI 线程 ( JNI 线程创建 | 线程执行函数 | 非 JNI 方法获取 JNIEnv 与 Java 对象 | 线程获取 JNIEnv | 全局变量设置 )
558 0