函数 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相关推荐

  1. POSIX线程专有数据的空间释放问题,pthread_key_create

    下面说一下线程中特有的线程存储, Thread Specific Data .线程存储有什么用了?他是什么意思了?大家都知道,在多线程程序中,所有线程共享程序中的变量.现在有一全局变量,所有线程都可以 ...

  2. pthread_key_t和pthread_key_create()详解

    pthread_key_t和pthread_key_create()详解 转载于:https://www.cnblogs.com/jingzhishen/p/5514327.html

  3. 多线程私有数据pthread_key_create

    在多线程的环境下,进程内的所有线程共享进程的数据空间.因此全局变量为所有线程共享.在程序设计中有时需要保存线程自己的全局变量,这种特殊的变量仅在线程内部有效. 如常见的errno,它返回标准的错误码. ...

  4. 记一次pthread_key_create导致的__nptl_deallocate_tsd段错误

    __nptl_deallocate_tsd rtoax 2021年5月25日 记一次由于pthread_key_create导致的__nptl_deallocate_tsd. 版本:glibc-2.1 ...

  5. pthread_key_create函数

    函数原型:  int pthread_key_create(pthread_key_t *key, void(*destructor)(void*)); 功能:  分配用于表示进程中线程特定数据的键, ...

  6. Linux环境编程--多线程

    本文作者: 姚继锋 (2001-08-11 09:05:00)    时隔多年 原文地址已经无从查...  居然是2001年就写了  今天看来对初学者还是很有参考意义  所以特转给大家 本人在原文基础 ...

  7. 程序员的自我修养--链接、装载与库笔记:运行库

    1. 入口函数和程序初始化 程序从main开始吗?:操作系统装载程序之后,首先运行的代码并不是main的第一行,而是某些别的代码,这些代码负责准备好main函数执行所需要的环境,并且负责调用main函 ...

  8. memcached(二)事件模型源码分析

    在memcachedd中,作者为了专注于缓存的设计,使用了libevent来开发事件模型.memcachedd的时间模型同nginx的类似,拥有一个主进行(master)以及多个工作者线程(woker ...

  9. linux boost filesystem程序链接,在Linux中链接Boost库

    我正在尝试使用Boost的Asio构建项目,但遇到了一些麻烦.最初,我试图在没有任何其他库的情况下构建项目,因为所有内容都应该放在头文件中. 我尝试构建的程序如下所示: #include #inclu ...

最新文章

  1. 6、Hive的特殊分隔符处理
  2. 在vue中怎么写行内样式高_说说在 Vue.js 中如何绑定样式(class 或 style)
  3. 【心情】今天买了YINSH!
  4. java成员变量的初始化
  5. 每日top3热点搜索词统计案例
  6. linux 触摸屏测试源码_Linux触摸屏驱动
  7. 飞鸽传书人必须对自己守信
  8. 大白菜UEFI版制作u盘启动盘使用教程
  9. php采集单线程卡死,php - 为什么我这段curl采集,单线程比多线程还快?
  10. 大话设计模式-原型模式的浅复制与深复制
  11. [lua]紫猫lua教程-命令宝典-L1-01-11. lua的个人补充
  12. Futter基础11篇: 实现自定义AppBar 定义顶部Tab切换、底部Tab结合顶部Tab实现类似头条页面布局
  13. 红黑树(Red Black Tree)
  14. 轻松玩转windows7之一:利用无线玩转虚拟网络
  15. 华硕(ASUS)路由器AP模式设置教程
  16. nRF24L01+ 数据手册
  17. 电脑之间利用串口传文件
  18. centos7笔记本触摸板单击无反应
  19. 英语作文计算机国际会议开幕词,学术会议开幕词英文.doc
  20. IDS反病毒与APT的具体介绍

热门文章

  1. java 链接重排序_JAVA中JVM的重排序详细介绍
  2. ​Cell:粟硕/施莽团队利用宏转录组揭示“野味”动物携带和人类疾病密切相关的多种病毒...
  3. 50T内存?百万机时?头一次见这么耗费内存和机时的分析?
  4. 挖掘PubMed数据库,获取报道的或推测新的基因调控关系
  5. 信奥中的数学:母函数
  6. nginx配置http自动跳转https方案
  7. anaconda moviepy_Anaconda和PyCharm的详细安装步骤~小白专用,手把手教学
  8. SQL工作笔记-达梦7存储过程中游标的使用(for循环 IF等)
  9. Qt工作笔记-依赖于QAbstractTableModel实现自定义TableModel
  10. Java高级语法笔记-文本文件的按行读取