iOS - 自旋锁
在 Objective-C 运行时中大量使用自旋锁,主要有以下几个原因:
1. 性能考虑
上下文切换成本
// 自旋锁实现
static ALWAYS_INLINE void OSSpinLockLock(volatile OSSpinLock *lock) {do {while (lock->value != 0) {__asm__ volatile ("pause"); // 不释放CPU,继续尝试}} while (!OSAtomicCompareAndSwap32(0, 1, &lock->value));
}// 相比互斥锁的实现
pthread_mutex_lock(&mutex); // 可能导致线程休眠和上下文切换
// ...
pthread_mutex_unlock(&mutex);
优势:
- 避免了线程上下文切换的开销
- 适合短期持有的场景
- 在多核处理器上效率更高
2. 使用场景特点
短暂的临界区
// 属性访问的典型场景
id objc_getProperty(id self, SEL _cmd, ptrdiff_t offset, BOOL atomic) {if (!atomic) return *((id *)((char *)self + offset));spinlock_t& slotlock = PropertyLocks[GOODHASH(offset)];slotlock.lock(); // 持锁时间极短id value = *((id *)((char *)self + offset));slotlock.unlock();return value;
}
特点:
- 锁的持有时间非常短
- 竞争不激烈
- 代码路径简单
3. 内存效率
结构简单
typedef struct {volatile int32_t value; // 仅需要一个32位整数
} OSSpinLock;// 相比互斥锁的复杂结构
struct pthread_mutex_t {// ... 更复杂的内部结构// 包含条件变量、等待队列等
};
优势:
- 内存占用小
- 缓存友好
- 初始化成本低
4. 适用的情况
理想场景
// 引用计数操作
inline bool objc_object::sidetable_tryRetain() {SideTable& table = SideTables()[this];bool result = false;table.lock(); // 快速的加锁解锁// 简单的引用计数操作table.unlock();return result;
}
最佳实践:
- 临界区执行时间短
- 线程等待时间短
- CPU资源充足
5. 潜在问题
优先级反转
// 可能出现的问题场景
while (lock->value != 0) {// 如果持有锁的是低优先级线程// 而等待的是高优先级线程// 可能导致优先级反转__asm__ volatile ("pause");
}
解决方案:
- iOS 10 后系统更多使用 os_unfair_lock
- 对于复杂场景使用互斥锁
- 需要考虑优先级时使用其他锁机制
6. 使用建议
适合使用自旋锁的场景
// 1. 简单的原子操作
atomic_property.lock();
value = _property;
atomic_property.unlock();// 2. 快速的引用计数操作
spinlock.lock();
refCount++;
spinlock.unlock();
不适合使用自旋锁的场景
// 1. 复杂的操作
lock.lock();
[self complexOperation]; // 耗时操作
lock.unlock();// 2. 可能阻塞的操作
lock.lock();
[self operationMayBlock]; // 可能阻塞
lock.unlock();
7. 总结
自旋锁在 Objective-C 运行时中的广泛使用是基于以下考虑:
- 性能优化:避免上下文切换
- 场景匹配:适合短期、快速的操作
- 资源效率:内存占用小,初始化快
- 实现简单:容易维护和调试
- 硬件友好:在现代多核处理器上表现良好
但需要注意:
- 不适合长时间持有
- 要考虑优先级反转问题
- iOS 10 后推荐使用 os_unfair_lock
- 复杂场景应考虑其他锁机制
相关文章:
iOS - 自旋锁
在 Objective-C 运行时中大量使用自旋锁,主要有以下几个原因: 1. 性能考虑 上下文切换成本 // 自旋锁实现 static ALWAYS_INLINE void OSSpinLockLock(volatile OSSpinLock *lock) {do {while (lock->value ! 0) {__asm__ volatile ("pause&q…...
web应用网站如何启用http2请求
要启用 HTTP/2 协议,您需要确保您的 Web 服务器软件支持 HTTP/2,并进行相应的配置。以下是一些常见的 Web 服务器软件及其启用 HTTP/2 的方法: 1. Nginx 对于 Nginx,您需要确保使用的是 1.9.5 或更高版本,因为这些版本…...

python进阶06:MySQL
课后大总结 Day1 一、数据库命令总结 1.连接数据库 连接数据库进入mysql安装目录打开bin文件夹,输入cmd(此命令后无分号)mysql.exe -u root -ppassword命令后输入密码:root 设置密码set passwordpassword("root123"); 查看所有数据库show databases; …...
mac 使用zip2john破解zip压缩包密码
一、下载: git clone https://github.com/magnumripper/JohnTheRipper.git cd JohnTheRipper/src ./configure sudo make -s clean && sudo make -sj4 cd ../run二、使用: zip2john提取提取 ZIP 文件的哈希: ./zip2john protecte…...

若依中Feign调用的具体使用(若依微服务版自身已集成openfeign依赖,并在此基础上定义了自己的注解)
若依中Feign调用具体使用 注意:以下所有步骤实现的前提是需要在启动类上加入注解 EnableRyFeignClients 主要是为开启feign接口扫描 1.创建服务提供者(provider) 导入依赖(我在分析依赖时发现若依本身已经引入openfeign依赖,并在此基础上自定义了自己的EnableRyF…...
【算法题系列】LeetCode 5.最长回文子串|JavaScript 5种思路实现
题目描述 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。 示例 2: 输入: "cbbd" 输出: &q…...
基于ROS先验地图的机器人自主定位与导航SLAM
2021年学习,当时参加科大讯飞的智能车大赛, 【语音交互启动-teb算法路径规划A*算法自动避障路径最短优化yolo5目标检测视觉结果判断分类终点指定点位自动泊车语音播报。】 【讯飞学院】http://www.iflyros.com/home/ 一、全局路径规划中的地图 栅格地图&…...
nginx 1.6.3配置虚拟主机与rewrite-location匹配规则
1、 Nginx 虚拟主机配置(配置文件末尾以分号[;]结尾) (1) 准备测试目录站点 [rootWEB conf]# cd /application/nginx/conf/ [rootWEB conf]# mkdir extra (创建虚拟主机存放目录࿰…...

1130-host ... is not allowed to connect to this MySql serve
局域网内另外一台电脑使用navicat连接Mysql出现上述问题:不允许连接 解决方案: 1、输入命令:进入mysql mysql -u root -p 2、输入命令:展示所有数据库 show databases; 3、输入命令进入mysql数据库: use mysql; 4、…...

力扣1502判断能否形成等差数列
class Solution:def canMakeArithmeticProgression(self, arr: List[int]) -> bool:# 对数组进行排序arr.sort()# 计算公差diff arr[1] - arr[0]# 从第二个元素开始逐个检查差值是否一致for i in range(1, len(arr) - 1):if arr[i 1] - arr[i] ! diff:return Falsereturn …...
Python版本变更历史及版本选择指南
Python版本变更历史及版本选择指南 Python版本变更历史及版本选择指南1. Python 3.13.1(2023年发布)主要特性适用场景 2. Python 3.12(2022年发布)主要特性 3. Python 3.11(2022年发布)主要特性 4. Python …...
初始值变量类型
状态名同步位置初始值变量类型不支持的UL刷新注意事项State父组件必填Object、classstring、number、boolean、enum类型,以及这些类型的数组。支持Date类型。对象的对象数组属性更新数组对象的属性更新 State装饰的变量必须初始化,否则编译期会报错。Sta…...
苍穹外卖 项目记录 day03
文章目录 菜品管理模块开发公共字段填充自定义注解 AutoFill自定义切面 AutoFillAspect在Mapper接口的方法上加入 AutoFill 注解 新增菜品文件上传实现新增菜品实现菜品分页查询删除菜品实现修改菜品实现 菜品管理模块开发 公共字段填充 在新增员工或者新增菜品分类时需要设置…...
统计字符【2】(PTA)C语言
本题要求编写程序,输入N个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。 输入格式: 输入在第一行中给出正整数N,第二行输入N个字符,最后一个回车表示输入结束,不算在内。 输出格式: 在一行内按照…...
如何在 Spring Cloud Gateway 中创建全局过滤器、局部过滤器和自定义条件过滤器
Spring Cloud Gateway 是一个功能强大的 API 网关,能够处理 HTTP 请求、响应及路由。通过过滤器机制,您可以在请求和响应过程中进行各种处理操作,如记录日志、身份验证、限流等。Spring Cloud Gateway 提供了三种主要类型的过滤器:…...
PINN模型详解
定义与原理 物理信息神经网络(Physics-Informed Neural Networks, PINN)是一种创新性的机器学习模型,巧妙地将物理知识与深度学习相结合。这种独特的设计理念源于Karniadakis教授的研究团队,他们在一系列开创性工作中提出了这一概念。 PINN的核心思想是在神经网络的损失函数…...

查找路由器的管理后台ip【通用找IP】
需求: 刚刚搞了个【小米】路由器,我想进路由的管理后台,提示:安装xx的路由管家,我不想安装 但是无法找到这个管理后台。 而且我是用这个路由作为中继,那么这个路由的ip就会经常更换 尝试通过网上搜索引擎来…...
AI如何改变IT行业
AI如何改变IT行业 在当今数字化的社会中,人工智能(AI)不仅仅是一个技术词汇,而是一个正在重塑我们生活的现实时态。如果把AI比作一场即将到来的暴风雨,那么IT行业就是它的海洋。在这场风暴中,所有的船只都…...
运行vue项目,显示“npm”无法识别为 cmdlet、函数、脚本文件或可操作程序的名称
PS D:\weduproject\wedu1\wedu\wedu-fast-vue> npm run dev,运行时出现像下面这样的报红信息, npm : The term npm is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or …...

Kubernetes开发环境minikube | 开发部署apache tomcat web单节点应用
minikube是一个主要用于开发与测试Kubernetes应用的运行环境 本文主要描述在minikube运行环境中部署J2EE tomcat web应用 minikube start --force minikube status 如上所示,在Linux中启动minikube运行环境 service docker start docker version service docker …...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...