iOS - TLS(线程本地存储)

从源码中,详细总结 TLS (Thread Local Storage) 的实现:

1. TLS 基本结构

// TLS 的基本结构
struct tls_data {pthread_key_t key;           // 线程本地存储的键void (*destructor)(void *);  // 清理函数
};// 自动释放池的 TLS
class AutoreleasePoolPage {static pthread_key_t const key = AUTORELEASE_POOL_KEY;  // TLS keystatic pthread_key_t key;                               // 实际的 key
};

2. TLS 初始化

void tls_init(void) {// 1. 创建线程键_objc_pthread_key = pthread_key_create(&_objc_pthread_destroyspecific);// 2. 初始化主线程的 TLSpthread_setspecific(_objc_pthread_key, &_objc_main_thread);// 3. 初始化自动释放池的 keyAutoreleasePoolPage::key = tls_create(&_objc_autoreleasepool_deallocate);
}

3. TLS 操作函数

// 1. 创建 TLS key
static pthread_key_t tls_create(void (*destructor)(void*)) {pthread_key_t key;int result = pthread_key_create(&key, destructor);if (result != 0) {_objc_fatal("pthread_key_create failed (%d)", result);}return key;
}// 2. 获取 TLS 值
static inline void *tls_get(pthread_key_t key) {return pthread_getspecific(key);
}// 3. 设置 TLS 值
static inline void tls_set(pthread_key_t key, void *value) {pthread_setspecific(key, value);
}

4. TLS 清理机制

// TLS 数据清理
static void tls_dealloc(void *p) {// 1. 检查占位符if (p == (void*)EMPTY_POOL_PLACEHOLDER) {return;}// 2. 清理自动释放池页面AutoreleasePoolPage *page = (AutoreleasePoolPage *)p;// 3. 验证页面完整性if (page->child) {_objc_fatal("thread-local storage corrupted");}if (page->parent) {_objc_fatal("thread-local storage corrupted");}// 4. 销毁页面page->kill();
}

5. TLS 在自动释放池中的应用

class AutoreleasePoolPage {// 1. 获取当前线程的热页面static inline AutoreleasePoolPage *hotPage() {AutoreleasePoolPage *result = (AutoreleasePoolPage *)tls_get_direct(key);if (result) result->fastcheck();return result;}// 2. 设置热页面static inline void setHotPage(AutoreleasePoolPage *page) {if (page) page->fastcheck();tls_set_direct(key, (void *)page);}
};

6. TLS 性能优化

// 1. 直接访问优化
static inline void *tls_get_direct(pthread_key_t key) {// 直接从线程本地存储获取数据return _pthread_getspecific_direct(key);
}// 2. 快速检查
void fastcheck() {
#if FASTAUTORELEASEPOOL_SPIN_DEBUG// 仅在调试模式下执行完整检查check(false);
#else// 生产环境只做基本检查if (!magic) _objc_fatal("bad magic");
#endif
}

7. TLS 线程安全

// 1. 线程安全的访问
void *getSpecific() {// pthread_getspecific 是线程安全的return pthread_getspecific(key);
}// 2. 线程检查
void check(bool die) {// 确保在正确的线程上操作if (thread != pthread_self()) {if (die) _objc_fatal("thread mismatch");}
}

8. TLS 使用场景

// 1. 自动释放池管理
static inline void *autoreleaseFast(id obj) {AutoreleasePoolPage *page = hotPage();if (page && !page->full()) {return page->add(obj);}return autoreleaseFullPage(obj);
}// 2. 线程特定数据
static void setThreadSpecific(id value) {tls_set(_objc_pthread_key, value);
}

总结要点:

1. 基本特性:

  • 线程私有存储
  • 键值对管理
  • 自动清理机制

2. 性能考虑:

  • 直接访问优化
  • 快速路径
  • 内存效率

3. 安全性:

  • 线程隔离
  • 数据保护
  • 完整性检查

4. 应用场景:

  • 自动释放池
  • 线程本地缓存
  • 线程特定数据

5. 注意事项:

  • 内存管理
  • 线程安全
  • 性能优化
  • 清理时机

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/3111.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字化时代,传统代理模式的变革之路

在数字化飞速发展的今天,线上线下融合(O2O)成了商业领域的大趋势。这股潮流,正猛烈冲击着传统代理模式,给它带来了新的改变。 咱们先看看线上线下融合现在啥情况。线上渠道那是越来越多,企业纷纷在电商平台…

接口测试自动化实战(超详细的)

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 前言 自从看到阿里云性能测试 PTS 接口测试开启免费公测,就想着跟大家分享交流一下如何实现高效的接口测试为出发点,本文包含了我在接口测…

意图颠覆电影行业的视频生成模型:Runway的Gen系列

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Runway开发的视频生成模型Gen系列,包括Gen-1、Gen-2和Gen3 Alpha等,这些模型每次发布都震惊AI圈,荣获多个视频生成的…

ant design vue的级联选择器cascader的悬浮层样式怎么修改

平时想要修改组件内定样式会使用穿透deep和!important调优先级,但是在这里都不行,样式都不能改变 后来尝试出来是因为加了scoped,样式不起作用,但是不能直接去掉scoped,别的样式会受到影响,单独…

linux手动安装mysql5.7

一、下载mysql5.7 1、可以去官方网站下载mysql-5.7.24-linux-glibc2.12-x86_64.tar压缩包: https://downloads.mysql.com/archives/community/ 2、在线下载,使用wget命令,直接从官网下载到linux服务器上 wget https://downloads.mysql.co…

使用 ChatGPT 生成和改进你的论文

文章目录 零、前言一、操作引导二、 生成段落或文章片段三、重写段落四、扩展内容五、生成大纲内容六、提高清晰度和精准度七、解决特定的写作挑战八、感受 零、前言 我是虚竹哥,目标是带十万人玩转ChatGPT。 ChatGPT 是一个非常有用的工具,可以帮助你…

TinyEngine v2.1版本发布:全新的区块方案和画布通信方案,打造更强力的可拓展低代码引擎

前言 2025年蛇年已经到来,TinyEngine v2.1.0 版本也已经蛇气腾腾的发布了出来,新年新气象,为了让大家更详细了解到 v2.1.0 的内容更新,我们特此列举了该版本中的一些重要特性更新。 v2.1.0变更特性概览 1、使用了新的纯前端区块…

【机器学习实战入门】使用OpenCV和Keras的驾驶员疲劳检测系统

嗜睡驾驶者警报系统 防止司机疲劳驾驶警报系统 中级 Python 项目 - 司机疲劳检测系统 疲劳检测是一种安全技术,能够预防因司机在驾驶过程中入睡而造成的事故。 本中级 Python 项目的目标是建立一个疲劳检测系统,该系统将检测到一个人的眼睛闭合了一段时…

Ubuntu本地部署网站

目录 1.介绍 2.安装apache 3.网页升级 1.介绍 网站其实就相当于一个文件夹,用域名访问一个网页,就相当于访问了一台电脑的某一个文件夹,在网页中看见的视频,视频和音乐其实就是文件夹里面的文件。为什么网页看起来不像电脑文件夹…

如何在vue中渲染markdown内容?

文章目录 引言什么是 markdown-it?安装 markdown-it基本用法样式失效?解决方法 高级配置语法高亮 效果展示 引言 在现代 Web 开发中,Markdown 作为一种轻量级的标记语言,广泛用于文档编写、内容管理以及富文本编辑器中。markdown…

【Linux】13.Linux进程概念(2)

文章目录 3. 进程进程进程状态查看僵尸进程危害进程状态总结孤儿进程 4. 进程优先级基本概念查看系统进程PRI and NIPRI vs NI使用top更改进程优先级 3. 进程 进程 看看Linux内核源代码怎么说。 为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。…

使用 Docker 部署 Java 项目(通俗易懂)

目录 1、下载与配置 Docker 1.1 docker下载(这里使用的是Ubuntu,Centos命令可能有不同) 1.2 配置 Docker 代理对象 2、打包当前 Java 项目 3、进行编写 DockerFile,并将对应文件传输到 Linux 中 3.1 编写 dockerfile 文件 …

基于机器学习的用户健康风险分类及预测分析

完整源码项目包获取→点击文章末尾名片! 背景描述 在这个日益注重健康与体能的时代,健身已成为许多人追求健康生活的重要组成部分。 本数据集包含若干健身房会员的详细信息,包括年龄、性别、体重、身高、心率、锻炼类型、身体脂肪比例等多项关…

【Mysql进阶知识】Mysql 程序的介绍、选项在命令行配置文件的使用、选项在配置文件中的语法

目录 一、程序介绍 二、mysqld--mysql服务器介绍 三、mysql - MySQL 命令行客户端 3.1 客户端介绍 3.2 mysql 客户端选项 指定选项的方式 mysql 客户端命令常用选项 在命令行中使用选项 选项(配置)文件 使用方法 选项文件位置及加载顺序 选项文件语法 使用举例&am…

[0242-07].第09节:SpringBoot中简单功能分析

SpringBoot学习大纲 一、静态资源访问分析: 1.1.静态资源默认路径: a.官网说明: 1.静态资源访问路径官方文档说明的路径 2.只要是静态资源,都默认放在类路径下: /static or /public or /resources or /META-INF/res…

28:CAN总线入门一:CAN的基本介绍

CAN总线入门 1、CAN总线简介和硬件电路1.1、CAN简要介绍1.2、硬件电路1.3、CAN总线的电平标准 2、帧格式2.1、数据帧(掌握)2.2、遥控帧(掌握)2.3、错误帧(了解)2.4、过载帧(了解)2.5…

nginx 配置域名前缀访问 react 项目

说明一下:我是使用域名转发访问的,访问流程如下: 浏览器 》 服务器1 》 服务器2 由于服务器1已经为 https 的访问方式做了 ssl 证书等相关配置,然后转发到服务器2, 所以在服务器2中不需要再配置 ssl 证书相关的东西了&…

Java设计模式——单例模式(特性、各种实现、懒汉式、饿汉式、内部类实现、枚举方式、双重校验+锁)

我是一个计算机专业研0的学生卡蒙Camel🐫🐫🐫(刚保研) 记录每天学习过程(主要学习Java、python、人工智能),总结知识点(内容来自:自我总结网上借鉴&#xff0…

Web3与加密技术的结合:增强个人隐私保护的未来趋势

随着互联网的快速发展,个人隐私和数据安全问题越来越受到关注。Web3作为新一代互联网架构,凭借其去中心化的特性,为个人隐私保护提供了全新的解决方案。而加密技术则是Web3的重要组成部分,进一步增强了隐私保护的能力。本文将探讨…

ElasticSearch下

DSL查询 叶子查询:在特定字段里查询特定值,属于简单查询,很少单独使用复合查询:以逻辑方式组合多个叶子查询或更改叶子查询的行为方式 在查询后还可以对查询结果做处理: 排序:按照1个或多个字段做排序分页…