pthread_key_create
函数 pthread_key_create() 用来创建线程私有数据。该函数从 TSD 池中分配一项,将其地址值赋给 key 供以后访问使用。第 2 个参数是一个销毁函数,它是可选的,可以为 NULL,为 NULL 时,则系统调用默认的销毁函数进行相关的数据注销。如果不为空,则在线程退出时(调用 pthread_exit() 函数)时将以 key 锁关联的数据作为参数调用它,以释放分配的缓冲区,或是关闭文件流等。
不论哪个线程调用了 pthread_key_create(),所创建的 key 都是所有线程可以访问的,但各个线程可以根据自己的需要往 key 中填入不同的值,相当于提供了一个同名而不同值的全局变量(这个全局变量相对于拥有这个变量的线程来说)。
注销一个 TSD 使用 pthread_key_delete() 函数。该函数并不检查当前是否有线程正在使用该 TSD,也不会调用清理函数(destructor function),而只是将 TSD 释放以供下一次调用 pthread_key_create() 使用。在 LinuxThread 中,它还会将与之相关的线程数据项设置为 NULL。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_key_t key ;
struct test_struct {
int i ;
float k ;
};
void * child1 ( void * arg )
{
struct test_struct struct_data ;
struct_data . i = 10 ;
struct_data . k = 3.1415 ;
pthread_setspecific ( key , & struct_data );
printf ( "结构体struct_data的地址为 0x%p \n " , & ( struct_data ));
printf ( "child1 中 pthread_getspecific(key)返回的指针为:0x%p \n " , ( struct test_struct * ) pthread_getspecific ( key ));
printf ( "利用 pthread_getspecific(key)打印 child1 线程中与key关联的结构体中成员值: \n struct_data.i:%d \n struct_data.k: %f \n " , (( struct test_struct * ) pthread_getspecific ( key )) -> i , (( struct test_struct * ) pthread_getspecific ( key )) -> k );
printf ( "------------------------------------------------------ \n " );
}
void * child2 ( void * arg )
{
int temp = 20 ;
sleep ( 2 );
printf ( "child2 中变量 temp 的地址为 0x%p \n " , & temp );
pthread_setspecific ( key , & temp );
printf ( "child2 中 pthread_getspecific(key)返回的指针为:0x%p \n " , ( int * ) pthread_getspecific ( key ));
printf ( "利用 pthread_getspecific(key)打印 child2 线程中与key关联的整型变量temp 值:%d \n " , * (( int * ) pthread_getspecific ( key )));
}
int main ( void )
{
pthread_t tid1 , tid2 ;
pthread_key_create ( & key , NULL );
pthread_create ( & tid1 , NULL , ( void * ) child1 , NULL );
pthread_create ( & tid2 , NULL , ( void * ) child2 , NULL );
pthread_join ( tid1 , NULL );
pthread_join ( tid2 , NULL );
pthread_key_delete ( key );
return ( 0 );
}
pthread_key_create相关推荐
- POSIX线程专有数据的空间释放问题,pthread_key_create
下面说一下线程中特有的线程存储, Thread Specific Data .线程存储有什么用了?他是什么意思了?大家都知道,在多线程程序中,所有线程共享程序中的变量.现在有一全局变量,所有线程都可以 ...
- pthread_key_t和pthread_key_create()详解
pthread_key_t和pthread_key_create()详解 转载于:https://www.cnblogs.com/jingzhishen/p/5514327.html
- 多线程私有数据pthread_key_create
在多线程的环境下,进程内的所有线程共享进程的数据空间.因此全局变量为所有线程共享.在程序设计中有时需要保存线程自己的全局变量,这种特殊的变量仅在线程内部有效. 如常见的errno,它返回标准的错误码. ...
- 记一次pthread_key_create导致的__nptl_deallocate_tsd段错误
__nptl_deallocate_tsd rtoax 2021年5月25日 记一次由于pthread_key_create导致的__nptl_deallocate_tsd. 版本:glibc-2.1 ...
- pthread_key_create函数
函数原型: int pthread_key_create(pthread_key_t *key, void(*destructor)(void*)); 功能: 分配用于表示进程中线程特定数据的键, ...
- Linux环境编程--多线程
本文作者: 姚继锋 (2001-08-11 09:05:00) 时隔多年 原文地址已经无从查... 居然是2001年就写了 今天看来对初学者还是很有参考意义 所以特转给大家 本人在原文基础 ...
- 程序员的自我修养--链接、装载与库笔记:运行库
1. 入口函数和程序初始化 程序从main开始吗?:操作系统装载程序之后,首先运行的代码并不是main的第一行,而是某些别的代码,这些代码负责准备好main函数执行所需要的环境,并且负责调用main函 ...
- memcached(二)事件模型源码分析
在memcachedd中,作者为了专注于缓存的设计,使用了libevent来开发事件模型.memcachedd的时间模型同nginx的类似,拥有一个主进行(master)以及多个工作者线程(woker ...
- linux boost filesystem程序链接,在Linux中链接Boost库
我正在尝试使用Boost的Asio构建项目,但遇到了一些麻烦.最初,我试图在没有任何其他库的情况下构建项目,因为所有内容都应该放在头文件中. 我尝试构建的程序如下所示: #include #inclu ...
最新文章
- 6、Hive的特殊分隔符处理
- 在vue中怎么写行内样式高_说说在 Vue.js 中如何绑定样式(class 或 style)
- 【心情】今天买了YINSH!
- java成员变量的初始化
- 每日top3热点搜索词统计案例
- linux 触摸屏测试源码_Linux触摸屏驱动
- 飞鸽传书人必须对自己守信
- 大白菜UEFI版制作u盘启动盘使用教程
- php采集单线程卡死,php - 为什么我这段curl采集,单线程比多线程还快?
- 大话设计模式-原型模式的浅复制与深复制
- [lua]紫猫lua教程-命令宝典-L1-01-11. lua的个人补充
- Futter基础11篇: 实现自定义AppBar 定义顶部Tab切换、底部Tab结合顶部Tab实现类似头条页面布局
- 红黑树(Red Black Tree)
- 轻松玩转windows7之一:利用无线玩转虚拟网络
- 华硕(ASUS)路由器AP模式设置教程
- nRF24L01+ 数据手册
- 电脑之间利用串口传文件
- centos7笔记本触摸板单击无反应
- 英语作文计算机国际会议开幕词,学术会议开幕词英文.doc
- IDS反病毒与APT的具体介绍
热门文章
- java 链接重排序_JAVA中JVM的重排序详细介绍
- ​Cell:粟硕/施莽团队利用宏转录组揭示“野味”动物携带和人类疾病密切相关的多种病毒...
- 50T内存?百万机时?头一次见这么耗费内存和机时的分析?
- 挖掘PubMed数据库,获取报道的或推测新的基因调控关系
- 信奥中的数学:母函数
- nginx配置http自动跳转https方案
- anaconda moviepy_Anaconda和PyCharm的详细安装步骤~小白专用,手把手教学
- SQL工作笔记-达梦7存储过程中游标的使用(for循环 IF等)
- Qt工作笔记-依赖于QAbstractTableModel实现自定义TableModel
- Java高级语法笔记-文本文件的按行读取