美文网首页
Linux 线程私有数据

Linux 线程私有数据

作者: FakeCSer爱去网吧 | 来源:发表于2020-02-29 12:13 被阅读0次

原理

  • 一键多值,所有线程都通过一个公用的键去访问,但是访问到的是不同的值
  • 对于线程来说其私有数据可以当做全局变量去访问,且其他的变量却访问不到
  • 两个线程对自己的私有数据操作是互相不影响的

相关api

pthread_key_create(创建一个键)
pthread_setspecific(为一个键设置线程私有数据)
pthread_getspecific(从一个键读取线程私有数据)
pthread_key_delete(删除一个键)

示例代码

#include <pthread.h>
#include <unistd.h>
#include <iostream>
using namespace std;

pthread_key_t key;//公用的键值

void echomsg(void * arg)
{
    cout << "Key of pthread " <<pthread_self() << "destructing..."<< endl;
}//键的析构函数

void * fun1(void *arg)//线程1
{
    int a = 10;
    pthread_setspecific(key,&a);//为键值设置私有数据
    cout << "in pthread " << pthread_self() << " value of key " <<(int *)pthread_getspecific(key)<<" is " << *(int *)pthread_getspecific(key) << endl;
    //通过私有线程的地址访问数据
}

void * fun2(void * arg)//线程2
{
    int a = 20;
    pthread_setspecific(key,&a);//为键值设置私有数据
    cout << "in pthread " << pthread_self() << " value of key " <<(int *)pthread_getspecific(key)<<" is " << *(int *)pthread_getspecific(key) << endl;
    //通过私有线程的地址访问数据
}

int main()
{

    pthread_t thread1,thread2;
    if(pthread_key_create(&key,echomsg)!=0)//创建一个键值
    {
        perror("key_create");
        exit(1);
    }

    pthread_create(&thread1,NULL,fun1,NULL);
    pthread_create(&thread2,NULL,fun2,NULL);
    pthread_join(thread1,NULL);
    pthread_join(thread2,NULL);
    
    pthread_key_delete(key);
    return 0;
}

运行结果如下



可见键值相同,但是不是一个地址空间

相关文章

  • Linux线程私有数据

    问题: 当把未线程化的程序转变成线程化时,当一些函数使用静态/全局变量时会出现一些问题,使用静态/全局变量的目的无...

  • Linux 线程私有数据

    原理 一键多值,所有线程都通过一个公用的键去访问,但是访问到的是不同的值 对于线程来说其私有数据可以当做全局变量去...

  • APUE读书笔记-12线程控制(4)

    6、线程特定数据 这里的线程特定数据也就是线程私有数据,是一种只存取指定线程相关的数据的一种机制。使用线程私有数据...

  • jvm的一些笔记

    jvm内存模型 一. 线程私有区域 线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束而创建/销毁(在...

  • java面试题 --- JVM之体系结构

    1. JVM 由哪些区域构成?由类加载器和运行时数据区构成;运行时数据区又分为线程私有和线程共享两大区域,线程私有...

  • volatile关键字和synchronized的区别

    java的线程抽象内存模型中定义了每个线程都有一份自己的私有内存,里面存放自己私有的数据,其他线程不能直接访问,而...

  • 线程特定数据

    Linux多线程实践(4) --线程特定数据 1. 线程特定数据是什么? 单线程 C 程序有两类基本数据:局部数据...

  • 关于安卓进阶面试题

    ThreadLocal作用以及原理? ThreadLocal用于实现在不同的线程中存储线程私有数据的类。在多线程的...

  • 终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLoc

    什么是ThreadLocal ThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数据...

  • 浅析 ThreadLocal (Android)

    一. ThreadLocal 是什么 ThreadLocal用于实现在不同的线程中存储线程私有数据的类,通过它可以...

网友评论

      本文标题:Linux 线程私有数据

      本文链接:https://www.haomeiwen.com/subject/usiuhhtx.html