iOS 线程同步几种方式

多线程同步目的有以下几个方面:第一,对一段代码的执行进行保护,如果同时执行一段代码,中间的临时变量可能会互相干扰造成结果不对;第二,对资源的保护,多个线程执行不同的代码,但是可能涉及同一个资源;第三,消息传递,一个线程通知另外一个线程发生了一件事。

iOS中常用线程同步方式:

NSLock

一个封装了pthread_mutex的OC对象,常用于保护一个代码块,如果NSLock对象已经被lock,当前线程放弃时间片并阻塞,等待锁的释放。

可以通过lockBeforeDate:限制一个锁定的时间,获取锁的时候也可以使用tryLock:来避免阻塞。

NSLock有3点要注意:unlock的执行线程必须和lock相同,否则行为未定义;在同一个线程上lock两次会造成死锁;向未lock的对象发送unlock会造成Crash。

NSRecursiveLock

NSRecursiveLock也是封装了一个pthread_mutex,和NSLock不同的是在NSLock中pthread_mutex的类型是 PTHREAD_MUTEX_ERRORCHECK,而在NSRecursiveLock中pthread_mutex的类型是PTHREAD_MUTEX_RECURSIVE。

在同一个线程上lock两次会造成死锁,但是一个线程在请求锁之前可能不知道这个锁是否已经被锁定,亦或一个函数可能会被多次或者递归调用,如果贸然加锁,就会造成死锁,此种情况下,应该使用NSRecursiveLock。NSRecursiveLock允许一个线程多次获取锁(同时需要相应的释放次数ÿ

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值