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


     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 *型的指针。须要对其进行强制类型转换。

      

【C/C++多线程编程之十】pthread线程私有数据的更多相关文章

  1. 【C/C++多线程编程之五】pthread线程深入理解

    多线程编程之pthread线程深入理解       Pthread是 POSIX threads 的简称,是POSIX的线程标准.           前几篇博客已经能给你初步的多线程概念.在进一步学 ...

  2. pthread线程私有数据

    进程内所有的线程共享地址空间,任何声明为静态或外部的变量,或在进程堆声明的变量都可以被进程内的所有线程读写. static,extern,或堆变量的值是上次线程改写的值 一个线程真正拥有的唯一私有存储 ...

  3. 【C/C++多线程编程之六】pthread相互排斥量

    多线程编程之线程同步相互排斥量       Pthread是 POSIX threads 的简称,是POSIX的线程标准.          Pthread线程同步指多个线程协调地,有序地同步使用共享 ...

  4. 【C/C++多线程编程之七】pthread信号量

    多线程编程之信号量      Pthread是 POSIX threads 的简称.是POSIX的线程标准.          相互排斥量用来处理一个共享资源的同步訪问问题,当有多个共享资源时,就须要 ...

  5. 数据结构(逻辑结构,物理结构,特点) C#多线程编程的同步也线程安全 C#多线程编程笔记 String 与 StringBuilder (StringBuffer) 数据结构与算法-初体验(极客专栏)

    数据结构(逻辑结构,物理结构,特点) 一.数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关.逻辑结构包括: 集合 数 ...

  6. linux多线程学习笔记六--一次性初始化和线程私有数据【转】

    转自:http://blog.csdn.net/kkxgx/article/details/7513278 版权声明:本文为博主原创文章,未经博主允许不得转载. 一,一次性初始化 以保证线程在调用资源 ...

  7. Linux系统编程——线程私有数据

    在多线程程序中.常常要用全局变量来实现多个函数间的数据共享.因为数据空间是共享的,因此全局变量也为全部线程共同拥有. 測试代码例如以下: #include <stdio.h> #inclu ...

  8. Posix线程编程指南(2) 线程私有数据

    概念及作用 在单线程程序中,我们经常要用到"全局变量"以实现多个函数间共享数据.在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有.但有时应用程序设计中有必要提供 ...

  9. UNIX环境高级编程——线程私有数据

    线程私有数据(Thread-specific data,TSD):存储和查询与某个线程相关数据的一种机制. 在进程内的所有线程都共享相同的地址空间,即意味着任何声明为静态或外部变量,或在进程堆声明的变 ...

随机推荐

  1. SQLServer2012 表IAM存储结构探究

    SQLServer2012 表IAM存储结构探究 Author:zfive5(zidong) Email: zfive5@163.com 引子 国庆节期间,一直在翻阅<程序猿的自我修养-链接.装 ...

  2. python:sql建表语句转换为json

    第一种sql格式: CREATE TABLE prpcitem_car ( proposalno ) NOT NULL, itemno ,) NOT NULL, riskcode ) NOT NULL ...

  3. python基于selenium+cv2+numpy实现登录某大型电商系统

    首先贴上我的安装包 一.selenium安装 I.打开pycharm,点击Settings,找到Project Interpreter,点击右边的下拉菜单下的show All...选项 II.点击sh ...

  4. libhiredis.so.0.13 => not found 缺少

    wget https://github.com/redis/hiredis/archive/v0.13.3.tar.gz tar -xzvf v0.13.3.tar.gz cd hiredis- ma ...

  5. Redis(二)、Redis持久化RDB和AOF

    一.Redis两种持久化方式 对Redis而言,其数据是保存在内存中的,一旦机器宕机,内存中的数据会丢失,因此需要将数据异步持久化到硬盘中保存.这样,即使机器宕机,数据能从硬盘中恢复. 常见的数据持久 ...

  6. BS程序性能调优

    首先想到的是优化算法.改进技术.扩展设备去做优化.其实在讨论性能的时候,绕不开对业务的理解,不同的业务系统对性能的要求不同,优化方式也不一样.优化性能的前提是保证业务的正确性.我们平时关注的性能主要是 ...

  7. 使用jQuery对图片进行居中设置

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 使用meta实现页面的定时刷新或跳转

    <meta http-equiv="refresh" content="5"> 这个表示当前页面每5秒钟刷一下,刷一下~ <meta http ...

  9. C#的split函数分割

    C#的split函数分割 string str = textBox1.Text; string[] strlist = str.Split("\r\n".ToCharArray() ...

  10. preparedStatement平台:

    public class cs{ public static void main(String[] args){ try{ class.forName("com.mysql.jdbc.Dri ...