iOS - 多线程-读写安全

iOS开发笔记之七十九——读写线程锁介绍(一) 一、读写锁 在多线程环境下,我们经常会遇到读写同步的问题。常见的做法就是将读写做成互斥操作,但是这样会降低读写性能。通常情况下我们希望读操作之间是不互斥的,这个时候就需要用到读写锁了。简单来说,读写锁要做的就是保证: 读与读不互斥 读与写互斥 写与写互斥 二、GCD提供的读写锁 GCD的并发队列有一个Barrier Block的概念,关于Barrier Block,Apple给出的解释如... 阅读详情

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

SQLite的多线程应用与iOS开发 对于SQLiite支持多线程的问题,我找到一片很不错的文章: http://www.keakon.net/2011/10/25/SQLite%E5%9C%A8%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%8E%AF%E5%A2%83%E4%B8%8B%E7%9A%84%E5%BA%94%E7%94%A8 。  文章很长,需要有耐心的读一下。  1. 对于多个进程可以同时打 阅读详情

相关推荐

FoundationPose实战:从零部署到Demo运行全记录

本文详细记录了FoundationPose从零部署到Demo运行的全过程,包括Ubuntu环境配置、项目部署、依赖安装及常见问题解决方案。特别针对复现过程中的关键步骤如CUDA版本选择、Eigen3安装等提供了实用技巧,帮助开发者高效完成FoundationPose的部署与调试。

weixin_27102543的博客 269

ios实现读写锁,AFN的实现

读写锁场景: 同一时间,只能有1个线程进行写的操作 同一时间,允许有多个线程进行读的操作 同一时间,不允许既有写的操作,又有读的操作 上面的场景就是典型的“多读单写”,经常用于文件等数据的读写操作,iOS中的实现方案有: 1、读写锁:pthread_rwlock 等待锁的线程会进入休眠 2、dispatch_barrier_async 这个函数传入的并发队列必须是自己通...

gcs的博客 5538

rk3576之imx415 4k@60fps

1;0;1;0;1;0;1;0;1;0;1;0;1;0;

darennet的专栏 705

iOS 中常见的几种锁-代码示例

iOS 中常见的几种锁介绍-示例 常用的各类锁性能比较 文中Demo 均实现在 XWInterviewDemos 1. iOS中的互斥锁 在编程中,引入对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问对象。 1.1 @synchronized (self) - (void)lock1 { @syn...

weixin_34366546的博客 340

opencode : 无法将“opencode“项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方案

opencode命令识别问题与openclawcodexgemini确保的路径在 PATH 中。这个知识对所有 npm 全局工具通用。

一键难忘的博客 4521

Python 实战:全面解析“微信搜一搜”内容爬取,从入门到企业级架构

本文将带你从零搭建爬虫项目,采用 Requests、Scrapy、Selenium、Proxy 池、中间人监控(如 Fiddler/mitmproxy)、分布式调度、数据库持久化、断点续抓等方案,实现可持续、抗封能力强的内容抓取系统。理解“微信搜一搜”页面结构与 Javascript 渲染逻辑;使用 Scrapy 框架搭建分布式爬虫;使用 Selenium 模拟浏览器抓取;构建代理池提升爬取成功率;对抗验证码、IP 封禁与 cookie 过期问题;

2201_76125261的博客 1393

iOS中的锁机制,各种锁的优缺点和作用

在iOS多线程编程中,锁机制是确保线程安全的关键工具之一。不同类型的锁具有各自的优缺点,适用于不同的场景。互斥锁适用于一般情况,读写锁适用于读操作频繁的情况,递归锁适用于递归算法,自旋锁适用于低竞争情况。了解这些锁的特性和使用方法,可以帮助开发者编写更安全、更高效的多线程代码。在多线程编程中,正确使用锁是确保数据一致性和应用程序稳定性的关键。通过合理选择和使用锁,我们可以充分发挥多核处理器的性能,提供更好的用户体验。在设计iOS应用程序时,考虑到多线程编程和锁的使用将有助于提高应用程序的质量和性能。

good7ob的博客 606

VMware如何安装img镜像,VMware如何安装openwrt软路由(含相关工具镜像)

VMware如何安装img镜像,VMware如何安装openwrt软路由(含相关工具镜像)

XiaoqiangClub的博客 4007

ios中的锁

代码测试可参考,只有实际写过才能更好的理解:https://www.jianshu.com/p/6d6832e42936 在平时开发中我们经常会使用多线程,多线程为我们带来了很大便利,也提高了程序的执行效率,但同时也带来数据风险:当至少有两个线程同时访问同一个变量,而且至少其中有一个是写操作时,就发生了Data race。所以这是就要利用一些同步机制来确保数据的准确性,锁就是同步机制中的一种。...

gcs的博客 1495

华为OD新系统机试真题 - 获取大写字母瓷砖拼出独特图案数量

华为OD机试新系统真题【获取大写字母瓷砖拼出独特图案数量】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统四月二十九号机试真题【获取大写字母瓷砖拼出独特图案数量】

qq_45776114的博客 1219

SAPIEN ManiSkill3 入门教程(一)

请注意,table.set_pose(pose) 设置的是演员在世界帧中的坐标系姿势。移除的实体可以再次添加到场景中,但已在场景中的实体则不能再次添加。显示器可以是物理的(如显示器),也可以是虚拟的(如 VNC)。我们可以通过 get_pose()、get_linear_velocity() 和 get_angular_velocity()获取演员的运动量(姿势、线速度、角速度)。现在,让我们创建一个斜坡。例如,您可能需要一个简单的碰撞形状来进行快速模拟,但却需要一个复杂的视觉形状来进行逼真的渲染。

机器人控制与仿真应用 3075

iOS-底层原理-多线程之atomic,读写安全

https://www.jianshu.com/p/a459ea2e7fec

Hanrovey Blog 537

图文详解Trae配置Java开发环境

本文介绍了Trae开发工具的安装配置流程:首先从官网下载安装Trae,然后安装Java开发所需的Extension Pack for Java和Spring Boot Extension Pack插件。关键步骤包括修改settings.json配置文件,需指定JDK路径、Maven可执行文件路径和用户设置文件路径。所有操作均配有图示说明,并强调要替换为实际电脑路径。

谷哥的小弟 5994

如何保证iOS的多线程安全

什么会给多线程的安全造成隐患? 有了多线程技术支持,我们可以并发的进行多个任务,因此同一块资源就有可能在多个线程中同时被访问(读/写)。这个现象叫作资源共享,比如多个线程同时访问了同一个对象,同一个变量或同一个文件,这样就有可能引发数据错乱何数据安全问题。 经典问题一——存钱取钱下面通过代码展示一下该问题 - (void)touchesBegan:(NSSet<UITouch *> *...

RUNNING-NIUER的博客 1576

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

iOS底层系列之<44>--多线程<十四>读写安全

本文介绍两种读写安全方式,pthread_rwlock_t 和dispatch_barrier_async使用介绍!

JH_Cao的博客 3307

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

android atomic 线程同步,iOS底层 -- 多线程之atomic、读写安全

一、atomicatomic用于保证属性setter、getter的原子性操作,相当于在getter和setter内部加了线程同步的锁可以参考源码objc4的objc-accessors.mmsetter方法实现static inline void reallySetProperty(id self, SEL _cmd, id newValue, ptrdiff_t offset, bool at...

weixin_39875805的博客 335

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

线程读写锁C语言,iOS底层原理 多线程之安全锁以及常用的读写锁 --(11)

上篇文章讲了GCD的用法,只要提到了多线程就应该想到线程安全,那么怎么做才能做到在多个线程中保证安全呢?这篇文章主要讲解下线程安全。线程安全线程安全是什么呢?摘抄一段百度百科的一段话线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。为什么需要线程安全ATM肯定用过...

weixin_42396502的博客 412

iOS 多线程安全数组

iOS-SDK只提供了非线程安全的数组。如果要多线程并发的使用一个数组对象就必须要加锁。在多线程下使数组安全,就是通过给数组的访问和修改添加同步限制,使数组多线程安全。

iOS_Manguoge的博客 3782

iOS 数组如何设计线程安全

在 iOS 开发中,多线程编程是提升应用性能的重要手段,但同时也带来了线程安全的问题。线程安全指的是多个线程在访问共享资源时,不会出现数据不一致、崩溃等意外情况。

小桥流水哗啦啦,iOS Coder 哒哒哒 1207

iOS的多线程安全隐患与线程同步方案

1、使用线程同步技术(同步,就是协同步调,按预定的先后次序进行)2、常见的线程同步技术是:加锁:买票、存钱取钱、生产消费关系。2、多线程同步解决方案OSSpinLockNSLock2.1、OSSpinLock 自旋锁1、OSSpinLock叫做”自旋锁”,等待锁的线程会处于忙等(busy-wait)状态,一直占用着CPU资源。2、目前已经不再安全,可能会出现优先级反转问题。3、如果等待锁的线程优先级较高,它会一直占用着CPU资源,优先级低的线程就无法释放锁。4、需要导入头文件。

2501_90211161的博客 956

ios 线程休眠_多线程安全iOS开发注意咯!!!

“多线程,作为实现软件并发执行的一个重要的方法,也开始具有越来越重要的地位!”正式因为多线程能够在时间片里被CPU快速切换,造就了以下优势资源利用率更好程序设计在某些情况下更简单程序响应更快但是并不是非常完美,因为多线程常常伴有资源抢夺的问题,作为一个高级开发人员并发编程那是必须要的,同时解决线程安全也成了我们必须要要掌握的基础一原子操作自旋锁其实就是封装了一个spinlock_t自旋...

weixin_30276247的博客 330

iOS GCD:队列、锁、安全解决方案

1:iOS中的常见多线程方案 2:GCD的常用函数 3:GCD的队列 4:死锁问题 5:问题 5.1:问题1: 5.2:问题2: 5.3:问题3: 6:多线程的安全隐患 7:(安全问题)解决方案 7.1:iOS中的线程同步方案 7.2:iOS线程同步方案性能比较 7.3:atomic ...

qq_27909209的博客 2907

iOS开发之多线程安全篇

多线程,作为实现软件并发执行的一个重要的方法,也开始具有越来越重要的地位! 正式因为多线程能够在时间片里被CPU快速切换,造就了以下优势 资源利用率更好 程序设计在某些情况下更简单 程序响应更快 但是并不是非常完美,因为多线程常常伴有资源抢夺的问题,作为一个高级开发人员并发编程那是必须要的,同时解决线程安全也成了我们必须要要掌握的基础 原子操作 自旋锁其实就是封装了一个spinlock_t自旋锁 自旋锁:如果共享数据已经有其他线程加锁了,线程会以死循环的方式等待锁,一旦被访问的资源被解锁,则等待资源的

iOS-大鑫 309

多线程安全-iOS开发注意咯!

多线程,作为实现软件并发执行的一个重要的方法,也开始具有越来越重要的地位! 正式因为多线程能够在时间片里被CPU快速切换,造就了以下优势 资源利用率更好 程序设计在某些情况下更简单 程序响应更快 但是并不是非常完美,因为多线程常常伴有资源抢夺的问题,作为一个高级开发人员并发编程那是必须要的,同时解决线程安全也成了我们必须要要掌握的基础 原子操作 自旋锁其实就是封装了一个spinlock_t自...

weixin_34290000的博客 140

多线程

一、iOS中常见的多线程方案 二、GCD GCD中有2个用来执行任务的函数 用同步的方式执行任务 void dispatch_sync(dispatch_queue_t queue, DISPATCH_NOESCAPE dispatch_block_t block...

chuoyi2983的博客 176

【iOS】下的读写锁的简单实现

废话开篇:iOS 下的多线程的技术的应用衍生出了锁的机制,试想,如果 iOS 下没有多线程的概念,所有的代码都会在同步环境下执行,那么,也就不会产生争夺资源情况的发生,当然,也就没有办法利用多核的优势。所以,多线程的应用是广布的,而锁的应用是局部的,所以,二者应相辅相成,来达到提高运行效率的同时提高程序运行的稳定性。 基本的三种锁的类型:互斥锁、自旋锁、读写锁。 其中,互斥锁 多线程在访问加锁中的临界区前,会进入休眠,一直等待解锁后系统调度 ;自旋锁 多线程在访问加锁中的临界区前,不进入休眠,会一直忙等。

BestpayTech的博客 2088
上一篇: iOS - 多线程-atomic
下一篇: Swift - swiftc
aiousee
博客等级 码龄14年 540粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值