iOS - 多线程-读写安全

文章目录

  • iOS - 多线程-读写安全
    • 1. 多读单写
      • 1.1 场景
      • 1.2 实现方案
        • 1.2.1 pthread_rwlock:读写锁
          • 1.2.1.1 示例
        • 1.2.2 dispatch_barrier_async:异步栅栏调用
          • 1.2.2.1 示例

iOS - 多线程-读写安全

假设有一个文件,A线程进行读取操作,B线程进行写入操作,那是非常危险的事情,会造成数据错乱

此时可能会对其进行加锁来保证线程同步

虽然加锁可以解决问题,但是针对该场景,操作其实不会影响原数据,因此是可以允许多线程同时读,以提高性能

其实就是实现多读单写的操作

1. 多读单写

1.1 场景

  • 同一时间,只能1个线程进行的操作
  • 同一时间,允许多个线程进行的操作
  • 同意时间,不允许即有的操作,又有的操作

1.2 实现方案

1.2.1 pthread_rwlock:读写锁
  • 等待锁的线程会进入休眠

1.2.1.1 示例
#import "ViewController.h"
#import <pthread.h>@interface ViewController ()@property (nonatomic, assign) pthread_rwlock_t lock;@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];self.title = @"pthread_rwlock_t";// 初始化锁pthread_rwlock_init(&_lock, NULL);
}- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {dispatch_queue_t queue = dispatch_get_global_queue(0, 0);for (int i = 0; i < 5; i++) {dispatch_async(queue, ^{[self read];});dispatch_async(queue, ^{[self read];});dispatch_async(queue, ^{[self write];});dispatch_async(queue, ^{[self write];});}
}- (void)read {pthread_rwlock_rdlock(&_lock);sleep(1);NSLog(@"%s", __func__);pthread_rwlock_unlock(&_lock);
}- (void)write {pthread_rwlock_wrlock(&_lock);sleep(1);NSLog(@"%s", __func__);pthread_rwlock_unlock(&_lock);
}@end

执行结果:

可以看到,的操作是连续的,的操作是间隔的

1.2.2 dispatch_barrier_async:异步栅栏调用
  • 这个函数传入的并发队列必须是自己通过dispatch_queue_cretate创建的
  • 如果传入的是一个串行或是一个全局并发队列,那这个函数便等同于dispatch_async函数的效果

可以理解为,每个操作都使用栅栏将其与其它线程隔离开

1.2.2.1 示例
#import "ViewController_barrier.h"@interface ViewController_barrier ()@property (nonatomic, strong) dispatch_queue_t queue;@end@implementation ViewController_barrier- (void)viewDidLoad {[super viewDidLoad];self.title = @"dispatch_barrier_sync";self.queue = dispatch_queue_create("rw_queue", DISPATCH_QUEUE_CONCURRENT);
}- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {for (int i = 0; i < 5; i++) {[self read];[self read];[self write];[self write];}
}- (void)read {dispatch_async(self.queue, ^{sleep(1);NSLog(@"%s", __func__);});
}- (void)write {dispatch_barrier_sync(self.queue, ^{sleep(1);NSLog(@"%s", __func__);});
}@end

打印结果:

同样达到多读单写的效果

@oubijiexi

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

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

相关文章

数智时代的AI人才粮仓模型解读白皮书(2024版)

来源&#xff1a;极客邦科技 自 2023 年上半年起&#xff0c;ChatGPT 等大模型技术蓬勃发展&#xff0c;AI 技术不断突破边界&#xff0c;展现 出惊人的潜力和发展速度。从早期的逻辑推理、专家系统&#xff0c;到如今的深度学习、神经网络&#xff0c; AI 技术显著缩小了科学…

ASP.NET企业投资价值分析系统

摘 要 本文将影响股票投资价值的宏观因素、行业因素、企业内部等诸多因素予以量化分析&#xff0c;对钢铁板块和汽车板块各上市公司进行综合评估&#xff0c;为广大股民的投资方向和资金安全提供了有力的支持。本文还阐述了企业投资价值分析的必要性&#xff0c;说明了企业投…

分类算法——模型评估(八)

1混淆矩阵 在分类任务下&#xff0c;预测结果与正确标记之间存在四种不同的组合&#xff0c;构成混淆矩阵&#xff08;适用于多分类&#xff09; TP True Possitive FN False Negative 2精确率&#xff08;Precision&#xff09;与召回率&#xff08;Recall&#xff09; 精…

mysql-sql-练习题-2

日期topN 日期最值 topN 任意区间topN 每年温度top2建表排名函数万能公式&#xff08;条关&#xff09; 任意区间 各科第1,3,5名排名函数万能公式 日期 本周过生日 -- 本周表示 加减日期 格式化 拼接 select * from student where date_format(s_age,concat(year(curdate()),…

微信小程序开发六(自定义组件)

自定义组件的创建&#xff1a; 如何创建&#xff1a; 右键选择新建component 创建完成之后需要打开app.json&#xff0c;这是全局使用这个组件&#xff0c;想要单独的页面使用&#xff0c;就在当前页面的json文件中定义 "usingComponents": {"my-zj": &quo…

冰箱主控 32位MCU,多通道、高精度的AD采样配合温度传感器,实现冰箱各温室的精确控温;低功耗设计

概览 小华高性价比32位MCU&#xff0c;多通道、高精度的AD采样配合温度传感器&#xff0c;实现冰箱各温室的精确控温&#xff1b;低功耗设计&#xff0c;绿色低碳、节能环保&#xff1b;模块化设计&#xff0c;充分利用丰富的通讯接口&#xff0c;使主控板、显示板和驱动板灵活…

远程连接docker,实现本地发布版本到服务器

最近在学jenkins的时候&#xff0c;发现涉及到了docker的远程发布调用。后续应该还要自己搭建一个docker的本地仓库。 简单描述一下具体是如何实现的&#xff1a; 1、将docker的服务器开启2375端口&#xff08;注意&#xff0c;这里的开启是将端口直接暴露出去&#xff0c;不用…

38-1 防火墙了解

一、防火墙的概念: 防火墙(Firewall),也称防护墙,是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网(US5606668 [A]1993-12-15)。它是一种位于内部网络与外部网络之间的网络安全系统,是一项信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。…

移远通信推出“全系统+全频段”GNSS定位模组LG290P,赋能高精度导航应用

近日&#xff0c;全球领先的物联网整体解决方案供应商移远通信正式对外宣布&#xff0c;其将推出全新款支持“全系统全频段”的工规级RTK高精度GNSS定位模组LG290P&#xff0c;用于满足智能机器人、无人机、精准农业、测量测绘等高精度定位应用场景所需。 高精度 LG290P 作为移…

Ubuntu+Systemd服务+实现开机自启/关机启动脚本

开机自启 1.创建一个新的 systemd 服务文件 现在随便一个地方创建txt文档 如果想要启动sh脚本&#xff0c;就把下面的代码输入到txt文档中 [Unit] DescriptionRun Python script on specific executable run Afternetwork.target[Service] Typesimple ExecStart/home/tech/…

记录些AI Agents设计模式和NL2SQL知识

吴恩达分享的四种 自我反思&#xff08;Reflection&#xff09;&#xff1a;可以自我修正&#xff1b;使用工具&#xff08;Tool Use&#xff09;&#xff1a;链接其他系统去做一些事情&#xff0c;比如把电脑里面的未归档文件做好归档&#xff1b;规划&#xff08;Planning&a…

红米K40手机刷机详解

了解什么是卡刷、什么是线刷 卡刷&#xff0c;就是把系统包放到你手机的SD卡&#xff0c;这一步&#xff0c;不用手机解BL锁&#xff0c;不用root&#xff0c;直接小米助手下载就可以刷。线刷就是用数据线连接电脑&#xff0c;通过XiaoMiFlash直接刷到手机&#xff0c;这一步权…

Pytorch实现线性回归模型

在机器学习和深度学习的世界中&#xff0c;线性回归模型是一种基础且广泛使用的算法&#xff0c;简单易于理解&#xff0c;但功能强大&#xff0c;可以作为更复杂模型的基础。使用PyTorch实现线性回归模型不仅可以帮助初学者理解模型的基本概念&#xff0c;还可以为进一步探索更…

WebSocket 深入浅出

WebSocket 深入浅出 1. WebSocket 是什么2. WebSocket 建立连接通信的过程3. WebSocket 和http的联系与区别4. WebSocket 的使用场景及限制 1. WebSocket 是什么 定义&#xff1a;WebSocket 是一种网络通信协议&#xff0c;它允许在单个TCP连接上进行全双工通信。是HTML5规范提…

电商技术揭秘三十七:电商智能风控业务架构设计

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘二十八&#xff1a;安全与合规性保障 电商技术揭秘二十九&#xff1a;电商法律合规浅析 电商技术揭秘三十&#xff1a;知识产权保…

无人机+激光雷达:高精度测绘级实时点云激光雷达技术详解

在现代测绘技术中&#xff0c;无人机与激光雷达的结合已经成为一种重要的技术手段。激光雷达&#xff08;LiDAR&#xff09;是一种主动式航空传感器&#xff0c;通过发射激光束并探测其与目标物体的反射&#xff0c;可以获取目标物体的位置、速度等特征信息。而无人机则作为一种…

ULTIMATE VOCAL REMOVER V5 for Mac:专业人声消除软件

ULTIMATE VOCAL REMOVER V5 for Mac是一款专为Mac用户设计的人声消除软件&#xff0c;它凭借强大的功能和卓越的性能&#xff0c;在音乐制作和后期处理领域崭露头角。 ULTIMATE VOCAL REMOVER V5 for Mac v5.6激活版下载 这款软件基于深度神经网络&#xff0c;通过先进的训练模…

不可重复读,幻读和脏读

不可重复读一般在读未提交&#xff0c;读已提交这两种隔离级别出现&#xff0c;第一次读和第二次读的数据不一致。 幻读一般在读未提交&#xff0c;读已提交&#xff0c;可重复读出现&#xff0c;原因是第一个事务执行时&#xff0c;第二个事务完成了提交&#xff0c;在第一个…

解决HttpServletRequest中的InputStream/getReader只能被读取一次的问题

一、事由 由于我们业务接口需要做签名校验&#xff0c;但因为是老系统了签名规则被放在了Body里而不是Header里面&#xff0c;但是我们不能在每个Controller层都手动去做签名校验&#xff0c;这样不是优雅的做法&#xff0c;然后我就写了一个AOP&#xff0c;在AOP中实现签名校…

Stable Diffusion教程:额外功能/后期处理/高清化

"额外功能"对应的英文单词是Extras&#xff0c;算是直译。但是部分版本中的翻译是“后期处理”或者“高清化”&#xff0c;这都是意译&#xff0c;因为它的主要功能是放大图片、去噪、修脸等对图片的后期处理。注意这里边对图片的处理不是 Stable Diffusion 本身的能…