zoukankan      html  css  js  c++  java
  • 【C/C++多线程编程之十】pthread线程私有数据

    多线程编程之线程私有数据


         Pthread是 POSIX threads 的简称。是POSIX的线程标准
            线程同步从相互排斥量【C/C++多线程编程之六】pthread相互排斥量信号量【C/C++多线程编程之七】pthread信号量,条件变量【C/C++多线程编程之八】pthread条件变量,读写锁【C/C++多线程编程之九】pthread读写锁多线程的同步机制已经有了清晰深入的探究,多线程编程的精髓所在,须要深入理解。
           线程私有数据TSD(Thread-specific Data),在【C/C++多线程编程之五】pthread线程深入理解中有提及,进程全局变量是被全部线程共享的,处于功能与安全的需求。有必要为线程提供线程全局变量。线程全局变量便是线程私有数据,仅在某个线程内有效。

           
                1. 线程私有数据

            线程私有数据通过关联的键值key识别,创建时将私有数据与key关联,通过key向线程私有数据写入内容,也通过key读取线程私有数据的内容,最后通过key 删除线程私有数据。 
            线程私有数据创建后,该进程内全部的线程都能够使用这个key向线程私有数据写入与读取数据。

    对不同的线程而言,同一个key值,分别訪问线程自己的私有数据,互不影响。

            举例:
            创建关联key的线程私有数据后。每一个线程都有一份相应的线程私有数据。
            线程A通过key訪问线程A中的相应的线程私有数据。

            线程B通过key訪问线程B中的相应的线程私有数据。

            2.线程私有数据基本函数
            #include<pthread.h>
    创建线程私有数据
            int pthread_key_create(pthread_key_t *key, void (*destr_function) (void *));
            该函数的第一个參数为键值key,第二个參数为销毁函数(一般设为NULL。不为空时,销毁线程私有数据时,会调用该函数以释放分配的内存)。
    写入数据
            int pthread_setspecific(pthread_key_t  key,  void  *pointer);
            该函数的第一个參数为键值key,第二个參数为写入数据指针(该指针类型为void* ,能够写入指向不论什么数据类型的指针)。pointer写入的是这个指针的值。而不是pointer指向的内容。
    读取数据
            void * pthread_getspecific(pthread_key_t key);
            该函数的參数为键值key。返回写入的数据。

    销毁线程私有数据
            int pthread_key_delete(pthread_key_t key);
            该函数的參数为键值key,用于销毁线程私有数据。

            3.牛刀小试:
            线程child1,child2均把自己的线程ID写入自己的线程私有数据中,写入的是一个指针,在读出的数据是void *型的指针。须要对其进行强制类型转换。

          
  • 相关阅读:
    Unity中的欧拉旋转
    Unity-Rigidbody碰撞穿透
    C#实现单例模式的几种方法
    C#OO初级思想
    C#虚方法virtual
    数据库查询
    DNS 域名服务器搭建
    iptables 基本操作
    通过adb 操作手机
    linux 调整逻辑卷空间大小
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6884087.html
Copyright © 2011-2022 走看看