pthread_once、pthread_key_create和pthread_getspecific和pthread_setspecific

linux中的线程局部存储(TLS)实现线程间的同步和互斥pthread_key_create、pthread_setspecific、pthread_getspecific 由于线程局部存储是基于操作系统的特性,因此它可能会受到操作系统实现的影响。不同的操作系统可能会有不同的线程局部存储实现和限制。 阅读详情
 NativeMessageQueue::NativeMessageQueue() {
    mLooper = Looper::getForThread();
    if (mLooper == NULL) {
        mLooper = new Looper(false);
        Looper::setForThread(mLooper);
    }

}

sp<Looper> Looper::getForThread() {
    int result = pthread_once(& gTLSOnce, initTLSKey);
    LOG_ALWAYS_FATAL_IF(result != 0, "pthread_once failed");

    return (Looper*)pthread_getspecific(gTLSKey);
}

pthread_once_t once_control=PTHREAD_ONCE_INIT;

int pthread_once(pthread_once_t *once_control,void(*init_routine)(void));

参数:

once_control         控制变量

init_routine         初始化函数

返回值:

若成功返回0,若失败返回错误编号。

 类型为pthread_once_t的变量是一个控制变量。控制变量必须使用PTHREAD_ONCE_INIT宏静态地初始化。

pthread_once函数首先检查控制变量,判断是否已经完成初始化,如果完成就简单地返回;否则,pthread_once调用初始化函数,并且记录下初始化被完成。如果在一个线程初始时,另外的线程调用pthread_once,则调用线程等待,直到那个现成完成初始话返回。

void Looper::initTLSKey() {
    int result = pthread_key_create(& gTLSKey, threadDestructor);
    LOG_ALWAYS_FATAL_IF(result != 0, "Could not allocate TLS key.");
}


线程存储的具体用法

创建一个类型为 pthread_key_t 类型的变量。

调用 pthread_key_create() 来创建该变量。该函数有两个参数,第一个参数就是上面声明的 pthread_key_t 变量,第二个参数是一个清理函数,用来在线程释放该线程存储的时候被调用。该函数指针可以设成 NULL ,这样系统将调用默认的清理函数。

当线程中需要存储特殊值的时候,可以调用 pthread_setspcific() 。该函数有两个参数,第一个为前面声明的 pthread_key_t 变量,第二个为 void* 变量,这样你可以存储任何类型的值。

如果需要取出所存储的值,调用 pthread_getspecific() 。该函数的参数为前面提到的 pthread_key_t 变量,该函数返回 void * 类型的值。

多线程私有数据pthread_key_create 阅读详情

相关推荐

Win7/Win10双系统兼容指南:Arduino IDE 1.8.19与2.3.2的安装避坑全攻略

本文详细解析了在Win7/Win10双系统环境下安装和配置Arduino IDE 1.8.19与2.3.2版本的完整指南,特别针对ESP32开发环境的深度配置和COM端口常见问题提供了实用解决方案。通过版本对比、安装优化和性能调优,帮助开发者高效搭建稳定的物联网开发环境。

weixin_30500105的博客 187

pthread_create,pthread_once,pthread_key_create,pthread_key_delete,pthread_getspecific,pthread_setspe...

pthread_create是UNIX环境创建线程函数 头文件   #include<pthread.h> 函数声明   int pthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg); 返回值...

weixin_30312563的博客 259

Linux基础——“C语言高级编程” C语言中的细节你真的知道吗?

文章目录GCC简介 GCC简介 gcc 所支持后缀名解释 .c c原始程序 .C / .cc /.cxx C++原始程

weixin_44278698的博客 2511

pthread_getspecific和pthread_setspecific详解

pthread_getspecific和pthread_setspecific详解

weixin_46935110的博客 2177

stm32使用TB6600驱动器控制42BYGH型步进电机

stm32使用TB6600驱动器控制42BYGH型步进电机

qq_35653974的博客 9585

S7-200SMART系列全套接线说明

SMART200接线方法,输入,输出,模拟量,面板,扩展糟等,并且详细说明接线原理。

文都龙哥 1万+

pthread_once,pthread_key_create,pthread_setspecific,pthread_getspecific

pthread_once_t once_control = PTHREAD_ONCE_INIT; int pthread_once(pthread_once_t *once_control, void (*init_routine)(void)); 这个api的主要用途是确保所有的线程传入同一个once_control时,init_routine只会被执行一次。后续线程再对同一个once_

华秋实的专栏 1321

海康线扫相机平场矫正实战:从原理到精准成像

本文深入解析了海康线扫相机平场矫正的原理与实战操作。通过拆解暗场与明场矫正的物理意义,揭示了其消除系统噪声、补偿像素响应不均的核心机制。文章详细指导了在海康相机上进行平场矫正的标准化流程、关键参数设置(如行高、灰度值控制)及常见误区,并提供了针对高行频匹配、环境稳定性维护等进阶调优技巧与问题排查指南,旨在帮助用户实现从原理理解到精准成像的跨越。

tomato的博客 790

多线程变量   pthread_key_t 自查文档

相关接口: #include <pthread.h> // init_routine函数在多线程环境中只执行一次 int pthread_once(pthread_once_t *once_control, void (*init_routine)(void)); pth...

chufangji6697的博客 137

Linux内核驱动模型--PCIe(PCI Express)驱动​​

本文系统介绍了Linux内核中PCIe驱动的设计与实现。首先从架构定位入手,指出PCIe驱动基于PCI子系统扩展支持高速、低功耗特性。核心数据结构struct pci_driver包含设备匹配表id_table、生命周期函数probe/remove等关键组件。文章详细解析了驱动与设备的绑定流程、资源管理机制,并重点阐述了MSI-X中断、电源管理、热插拔和多队列等高级特性实现方案。最后提供了lspci、dmesg等调试工具的使用方法,总结了PCIe驱动在支持高性能设备中的关键作用。全文通过架构设计、核心结构、

amy_mhd的博客 427

从 VS Code 登录 ABAP Destination,一次把前后端连接跑通

最近很多 ABAP 开发者开始把 VS Code 纳入日常开发环境,原因很直接,VS Code 的轻量体验、命令面板、文件树、插件生态和 AI 编程能力,已经深深影响了现代开发者的工作方式。SAP 官方发布的 ABAP Development Tools for VS Code,也把 ABAP Cloud 开发模型带进了这个编辑器里。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 226

pthread---一次性初始化&&线程私有数据

一次性初始化     有时候我们需要对一些posix变量只进行一次初始化,如线程键(我下面会讲到)。如果我们进行多次初始化程序就会出现错误。     在传统的顺序编程中,一次性初始化经常通过使用布尔变量来管理。控制变量被静态初始化为0,而任何依赖于初始化的代码都能测试该变量。如果变量值仍然为0,则它能实行初始化,然后将变量置为1。以后检查的代码将跳过初始化。     但是在多线程程序设计中,

joker0910的专栏 9228

海思3559av100平台lan9500模块调试记录

1. 前言 通过USB2.0接口扩展一路百兆虚拟网口 2. 配置lan9500驱动 make ARCH=arm64 menuconfig 开启LAN95XX驱动,编译进内核 保存内核配置 3. 编译内核 make ARCH=arm64 CROSS_COMPILE=aarch64-himix100-linux- uImage -j 20 cd ../../arm-trusted-firmware/arm-trusted-firmware ./mk.sh cp ...

jzwjzw19900922的博客 908

线程私有数据thread-specific

设计线程私有数据主要基于一下两点需求:  1.我们希望线程间不需要同步机制就能访问各自的separate数据  2.我们期望由于历史原因以进程为基础设计的接口可以适应多线程环境    为实现线程私有数据POSIX规定了如下接口: int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));  这个函数创

louiswang2009的专栏 1368

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

线程特定(私有)数据

    简单的讲,线程特定(私有)数据是每个线程的局部变量,更改线程A中的线程特定(私有)数据,并不会影响到线程B中相对应的线程特定(私有)数据。常见的errno就是线程特定(私有)数据,每个线程重置errno的操作并不会影响进程中其他线程的errno值。     下面介绍下线程特定数据的使用技巧。 int pthread_key_create(pthread_key_t* keyp,void ...

JaweG 386

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Linux之并发多线程服务器-2

从上面我们可以实现多线程服务器,但是我们在实现复杂功能时,要注意避免使用静态变量和同步问题。Linux系统中提供了线程特定数据(TSD)来取代静态变量。它类似于全局变量。但是是各个线程私有的,它以线程为界限。TSD是定义线程私有数据的唯一方法。同一进程中的所有线程,他们的同一特定数据项都由一个进程内唯一的关键字 KEY来标志。用了这个关键字,线程可以存取线程私有数据。 在线程特定数据中通常使用

kejie1235的专栏 695

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

linux线程特定函数个人理解

线程特定函数有以下三个 int pthread_key_create(pthread_key_t *key, void (*destr_function) (void *)); void *pthread_getspecific(pthread_key_t key); int pthread_setspecific(pthread_key_t key, const void *value);...

qq_34489443的博客 199

APUE——线程私有数据

APUE链接 线程私有数据链接1 pthread_once链接 1. 线程私有数据 进程中的所有线程都可以访问进程的整个地址空间。除了使用寄存器以外,线程没有办法阻止其他线程访问它的数据,线程私有数据也不例外 线程私有数据(也称线程特定数据)是存储和查询与某个线程相关的数据的一种机制。把这种数据称为线程私有数据或线程特定数据的原因是:希望每个线程可以独立地访问数据副本,而不需要担心与其他线程的同步访问问题。 errno被重新定义为线程私有数据。这样,一个线程做了设置errno的操作并不会影响进程中其他线程的

weixin_44537992的博客 453

linux系统编程(三):pthread线程本地存储TLS详解

让某个状态/上下文在每个线程内部独立,但不需要通过函数参数到处传。工具复杂度性能自动清理推荐场景int / ptr⭐⭐⭐⭐⭐⭐❌简单标量、计数器、深度__thread(GCC)⭐⭐⭐⭐⭐⭐❌同上,老编译器⭐⭐⭐⭐⭐⭐✅动态分配的资源(malloc/fopen/socket)全局变量 + mutex⭐⭐⭐❌不推荐—— 重新发明 TLS能用就用—— 简单、零成本需要 destructor 才用—— 自动清理动态资源不要用全局 + mutex 模拟 TLS。

FlightYe的专栏 329

线程私有数据 ——TSD

转载 :https://blog.youkuaiyun.com/zjf280441589/article/details/43883033   线程特定数据 int pthread_key_create(pthread_key_t *key, void (*destr_function) (void *)); int pthread_key_delete(pthread_key_t key);   in...

张飞online博客 391

12.6 线程控制_线程私有数据

      线程私有数据是存储和查询与某个线程相关的数据的一种机制。      在分配线程私有数据之前,需要创建与该数据关联的键。这个键将用于获取对线程私有数据的访问权。使用pthread_key_create创建一个键。#include int pthread_key_create(pthread_kdy_t *keyp, void (*destructor)(void *));

cxf100900的专栏 608

线程特有数据

线程特有数据的具体实现,不是我们应该关心的。但是了解它的实现,有助于我们理解它的使用方法。

随手写下笔记和感悟 213

《UNIX环境高级编程》笔记--线程私有数据

线程私有数据时存储和查询与某个线程相关的数据的一种机制。把这种数据成为线程私有数据或线程特定数据的原因是, 希望每个线程都可以独立地访问数据副本,并不需要担心与其他线程的同步访问问题。 为什么要使用线程私有数据呢?原因有两个: 1.有时候需要维护基于每个线程的数据,因为线程ID并不能保证是小而连续的整数,所以不能简单地分配一个线程数据 数组,用线程ID作为数组的索引。即使线程ID确实是小而

TODD911的专栏 1958

linux线程存储,Linux系统编程手册:线程:线程安全和每线程存储

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?若函数可同时供多个线程安全调用,则称之为线程安全函数。反之,如果不是线程安全的,就不能并发调用。一次性初始化#include int pthread_once(pthread_once_t *once_control, void (*init)(void));/* 成功返回0,失败返回正的errno值 */利用参数onc...

weixin_32467421的博客 155

线程私有数据linux,linux线程私有数据

线程特定数据,也被称为线程私有数据,是一种存储和查找一个特定线程相关数据的机制。我们称这个数据为线程特定或线程私有的原因,是我们想每个线程访问它自己独立的数据拷贝,而不用担心和其它线程的访问的同步。许多人在设计促进共享进程数据和属性的线程模型时碰到很多麻烦。所以为什么任何人在这个模型里都想要促进避免共享的接口呢?有两个原因。首先,有时我们需要为每个线程维护数据。因为没有保证线程ID是小的连续的整型...

weixin_29123181的博客 294

Linux多线程实践(4) --线程特定数据

线程特定数据 int pthread_key_create(pthread_key_t *key, void (*destr_function) (void *)); int pthread_key_delete(pthread_key_t ...

weixin_33834679的博客 81
上一篇: android IPC通信中的UID和PID识别
下一篇: android 动态库跟踪的一个小办法
tmpantian
博客等级 码龄19年 4粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值