iOS 多线程同步 锁

iOS开发之多线程 iOS开发之多线程本文章博主和大家一块学习多线程,很自然就涉及到线程和进程,然后涵括NSThread、GCD、NSOperation!然后就是最牛叉的RunLoop和Runtime。一、线程与进程进程是指在系统中正在运行的一个应用程序,就是一段程序的执行过程,每个进程之间是相互独立的。一个进程要想执行任务,必须要有线程,至少有一条线程,一个进程的所有任务都是在线程中执行。其实应用程序启动的时候我么你 阅读详情

在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题:

方法一,@synchronized(id anObject),(最简单的方法)
会自动对参数对象加锁,保证临界区内的代码线程安全

[cpp]  view plain  copy
 print ?
  1. @synchronized(self)  
  2.   
  3. {  
  4.   
  5.        // 这段代码对其他 @synchronized(self) 都是互斥的         
  6.   
  7.        // self 指向同一个对象  
  8.   
  9. }   

方法二,NSLock
NSLock对象实现了NSLocking protocol,包含几个方法:
lock,加锁
unlock,解锁
tryLock,尝试加锁,如果失败了,并不会阻塞线程,只是立即返回NO
lockBeforeDate:,在指定的date之前暂时阻塞线程(如果没有获取锁的话),如果到期还没有获取锁,则线程被唤醒,函数立即返回NO
比如:

[cpp]  view plain  copy
 print ?
  1. NSLock *theLock = [[NSLock alloc] init];   
  2. if ([theLock lock])   
  3. {  
  4.    //do something here  
  5.    [theLock unlock];   
  6. }   
方法三,NSRecursiveLock,递归锁
NSRecursiveLock,多次调用不会阻塞已获取该锁的线程。

[cpp]  view plain  copy
 print ?
  1.  NSRecursiveLock *theLock = [[NSRecursiveLock alloc] init];   
  2.  void MyRecursiveFunction(int value)   
  3. {   
  4.  [theLock lock];   
  5.  if (value != 0)   
  6. <span style="font-size:14px;"> </span>{   
  7.     –value;   
  8.     MyRecursiveFunction(value);   
  9.  }  
  10.  [theLock unlock];   
  11. }   
  12.   
  13.  MyRecursiveFunction(5);  

方法四,NSConditionLock,条件锁
NSConditionLock,条件锁,可以设置条件

[cpp]  view plain  copy
 print ?
  1. //公共部分  
  2. id condLock = [[NSConditionLock alloc] initWithCondition:NO_DATA];   
  3.        
  4.  //线程一,生产者  
  5.  while(true) {   
  6.         [condLock lockWhenCondition:NO_DATA];   
  7.         //生产数据  
  8.         [condLock unlockWithCondition:HAS_DATA];   
  9. }  
  10.        
  11.  //线程二,消费者  
  12.  while (true) {   
  13.         [condLock lockWhenCondition:HAS_DATA];   
  14.         //消费  
  15.         [condLock unlockWithCondition:NO_DATA];   
  16. }  

方法五,NSDistributedLock,分布锁
NSDistributedLock,分布锁,文件方式实现,可以跨进程
用tryLock方法获取锁。
用unlock方法释放锁。
如果一个获取锁的进程在释放锁之前挂了,那么锁就一直得不到释放了,此时可以通过breakLock强行获取锁。


转:http://blog.youkuaiyun.com/likendsl/article/details/8568961

iOS 线程同步几种方式 多线程同步目的有以下几个方面:第一,对一段代码的执行进行保护,如果同时执行一段代码,中间的临时变量可能会互相干扰造成结果不对;第二,对资源的保护,多个线程执行不同的代码,但是可能涉及同一个资源;第三,消息传递,一个线程通知另外一个线程发生了一件事。 iOS中常用线程同步方式: NSLock 一个封装了pthread_mutex的OC对象,常用于保护一个代码块,如果NSLock对象已经被loc... 阅读详情

相关推荐

iOS 多线程同步策略之-----锁NSLock和@synchronized

1.NSLock---锁同步 - (void)viewDidLoad { [super viewDidLoad]; NSLock * lock = [[NSLock alloc]init]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [lock

choudang的专栏 2987

iOS中的多线程与线程同步

iOS中的多线程与线程同步

m0_60259116的博客 655

RDMA网络通信技术、NCCL集合通讯(GPU)

NCCL 是 NVIDIA 专为 GPU 设计的高性能集合通信库,用于优化多 GPU、多节点间的集体操作(如 AllReduce、Broadcast、AllGather 等),是深度学习分布式训练的核心组件。RDMA 允许计算机直接访问远程内存,无需 CPU 干预,大幅降低了网络通信的延迟和 CPU 开销。常见的 RDMA 实现包括。是两项关键技术,用于优化节点间数据传输效率和大规模并行计算性能。在高性能计算(HPC)、人工智能训练和数据密集型场景中,

weixin_42795092的博客 2421

iOS——线程安全、线程同步与线程通信

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作(更改变量),一般都需要考虑线程同步,否则的话就可能影响线程安全。

m0_73348697的博客 2621

OpenHarmony自定义Launcher

OpenHarmony源码版本:4.0release开发板:DAYU / rk3568DevEco Studio版本:4.0.0.600切换分支为OpenHarmony-4.0-Release,并下载源码。

Abner_Crazy的博客 1628

数字后端DRC Violation定位与自动化修复:Innovus与Calibre协同实战

设计规则检查(DRC)是芯片tapeout前确保版图可制造性的关键验证环节。在数字后端流程中,Calibre作为signoff级物理验证工具,会依据代工厂SVRF规则文件对GDS进行严格几何检查;而Innovus则提供快速迭代的in-design DRC反馈。两者协同成为工程师定位violation、保障流片成功的主流工作流。面对成千上万条DRC violation,高效的定位与分类思路、跨工具映射技巧,以及基于Tcl脚本的自动化修复方法,能大幅缩短物理验证周期。本文从DRC的分层定位出发,结合Innovu

weixin_29185167的博客 335

【iOS多线程(一)】GCD详细总结-同步异步/串行并发

1. GCD简介2. GCD任务和队列任务队列 (dispatch是派遣的意思)队列的创建方法和获取方法3.我的总结:同步和异步函数,并行和并发队列同步异步函数串行并发队列是否开启新线程,串行还是并发执行任务,如何分析?4. GCD基本使用同步串行队列同步并行队列异步串行队列异步并行队列sync函数造成的线程死锁5. 进程间通信6. GCD的其他方法6.1 GCD栅栏方法:dispatch_barrier_async6.2、GCD 延时执行方法:dispatch_after。

cheng_lin0201的博客 1929

手把手教你用闲置安卓手机搭建个人收款系统(蓝鲸支付私有化部署实战)

本文详细介绍了如何利用闲置安卓手机搭建个人收款系统,实现私有化支付部署。通过开源技术栈和容器化方案,零成本构建安全、高效的支付网关,解决传统支付平台的数据安全和资金风险问题。特别适合个人开发者和小微企业主,无需复杂审批,资金实时到账,显著降低运营成本。

weixin_30363285的博客 380

iOS 多线程 锁 互斥 同步

在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题: >>>方法一,@synchronized(id anObject),(最简单的方法) 会自动对参数对象加锁,保证临界区内的代码线程安全 @synchronized(self) {        // 这段代码对其他 @synchronized(self) 都是互斥的        // self 指向同一个对象} >>

x32sky的专栏 3810

过压保护电路(OVP)

作者:AirCity 2020.2.4 Aircity007@sina.com 本文所有权归作者Aircity所有 1 示例一 当VBUS=5V时,各点电压电流如图所示,Q1接近截止,输出信号是5V。 当VBUS=5.4V开始,输出信号开始下降,直到VBUS=6.1V,输出信号降低为0.6V。 下面是实测波形,这个电路,输出信号的电压不会超过5.4V,这个输出信号可用于电源的控制信号。 2 ...

AirCity123的博客 3万+

hi3516cv610在PQStream上实现拉出图像,windows和板端操作记录

PQStream拉出图像

weixin_51838255的博客 728

iOS多线程,锁,互斥,同步

转自:手机之上 在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题: >>>方法一,@synchronized(id anObject),(最简单的方法) 会自动对参数对象加锁,保证临界区内的代码线程安全 @synchronized(self) {        // 这段代码对其他 @synchronized(self) 都是互斥的        // se

Cgema的专栏 1103

避坑指南:C#调用CodeSoft打印标签时常见的5个错误及解决方法

本文总结了C#调用CodeSoft打印标签时常见的5个核心错误及解决方案,涵盖环境配置、模板加载、变量赋值、打印机切换和资源管理。重点解析了如何避免COM对象创建失败、模板路径错误、变量名不匹配、打印机切换异常及内存泄漏等问题,帮助开发者实现稳定高效的标签打印集成。

weixin_29215815的博客 222
上一篇: 关于iOS 后台执行任务
下一篇: UIImage 加载方式及优化
直隶码农
博客等级 码龄19年 95粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值