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

      

【C/C++多线程编程之十】pthread线程私有数据

时间: 2024-12-21 00:14:48

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

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

多线程编程之pthread线程深入理解  Pthread是 POSIX threads 的简称,是POSIX的线程标准. 前几篇博客已经能给你初步的多线程概念.在进一步学习线程同步等多线程核心知识之前,须要对多线程深入的理解.非常多人忽略或者回避这部分内容,直接的问题是学习者无法把握多线程编程的内在原理,理解的层次太浅.           1.进程资源:                      进程资源有存储资源与其它资源.其它资源包括环境变量.地址,文件等.存储资源.进程的内存分配,博客[

【C/C++多线程编程之六】pthread互斥量

多线程编程之线程同步互斥量  Pthread是 POSIX threads 的简称,是POSIX的线程标准. Pthread线程同步指多个线程协调地,有序地同步使用共享资源.[C/C++多线程编程之五]pthread线程深入理解中讲述到,多线程共享进程资源,一个线程访问共享资源需要一段完整地时间才能完成其读写操作,如果在这段时间内被其他线程打断,就会产生各种不可预知的错误.协调线程按一定的规则,不受打扰地访问共享资源,保证正确性,这便是线程同步的出发点.        互斥量,是最简单的线程同步

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

多线程编程之信号量 Pthread是 POSIX threads 的简称,是POSIX的线程标准. 互斥量用来处理一个共享资源的同步访问问题,当有多个共享资源时,就需要用到信号量机制.          信号量机制用于保证两个或多个共享资源被线程协调地同步使用,信号量的值对应当前可用资源的数量.          1.信号量(samaphore):         信号量机制通过信号量的值控制可用资源的数量.线程访问共享资源前,需要申请获取一个信号量,如果信号量为0,说明当前无可用的资源,线程无

【C/C++多线程编程之八】pthread条件变量

多线程编程之条件变量 Pthread是 POSIX threads 的简称,是POSIX的线程标准. 互斥机制,包括互斥量[C/C++多线程编程之六]pthread互斥量,信号量[C/C++多线程编程之七]pthread信号量,互斥能很好的处理共享资源访问的协调问题,是多线程同步必不可少的机制.互斥机制也有其缺陷,当线程在等待共享资源满足某个条件,互斥机制下,必须不断地加锁和解锁,其间查询共享资源是否满足条件,这将带来巨大的消耗.         此时,需要新的机制来解决这个问题.      

java多线程编程(1) 线程的基本知识

在前面研究过多线程与进程的区别. 这里在稍微总结一下: 进程:程序动态的一次执行过程. 线程:可以只是程序员的一部分的执行过程 每个进程有多个线程组成,在java程序中,至少两个线程一个是垃圾回收线程和main线程. 线程占有的资源更少,早java中就是每个线程都有自己的工作区,就是有自己独立的栈空间.多个线程共享一些内存资源,堆是共享的. 多线程的力度小,并发度高,这样系统的吞吐量就很大,只有好处吗?调度和执行线程是需要资源的,就是像是数据库中的索引和数据库中的锁一个道理,并发会带来什么问题呢

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

在多线程程序中,经常要用全局变量来实现多个函数间的数据共享.由于数据空间是共享的,因此全局变量也为所有线程共有. 测试代码如下: #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <stdlib.h> int key = 100; //全局变量 void *helloworld_one(void *arg) { printf("the message is %s

posix多线程--线程私有数据

1.当多个线程共享一个变量时,将该变量定义为静态或外部变量,使用互斥量确保共享变量的安全访问.如果每个线程都需要一个私有变量值,则该值成为线程的私有数据.程序创建一个键,每个线程独立地设定或得到自己的键值,各线程间私有数据互不影响. 2.建立线程私有数据int pthread_key_create(pthread_key_t *key,void (*destructor)(void *));int pthread_key_delete(pthread_key_t key);int pthread

pthread线程特定数据

线程特定数据,也被称为线程私有数据,是一种存储和查找一个特定线程相关数据的机制.我们称这个数据为线程特定或线程私有的原因,是因为每个线程访问它自己独立的数据拷贝,而不用担心和其它线程的访问的同步. 线程特定数据看似很复杂,其实我们可以把它理解为就是一个索引和指针.key结构中存储的是索引,pthread结构中存储的是指针,指向线程中的私有数据,通常是malloc函数返回的指针. POSIX要求实现POSIX的系统为每个进程维护一个称之为Key的结构数组(如图1所示),这个数组中的每个结构称之为一

12.6 线程私有数据

线程私有数据是一种用于存储和获取与特定线程相关联数据的机制,称为线程特定的或者是线程私有的,是因为我们希望每个线程都可以独立访问其独有的数据,而不用担心与其他线程的同步访问问题. 许多人费力实现了促进进程数据以及属性贡献的线程模型,那么为什么还有人想要实现一个接口,在这样一个模型中防止共享呢?有如下两点原因: 首先,有些时候我们需要以线程为基础维护一些数据,因为没有任何机制可以保证线程ID总是比较小的,且是连续的整数,因此我们不能简单地将每一个线程的私有数据分配为一个数组,然后使用线程ID作为索