
要保证线程安全,就必须要线程同步,而在iOS中线程同步的方案有:
在 iOS 中,原子 *** 作可以保证属性在单独的 setter 或者 getter 方法中是线程安全的,但是不能保证多个线程对同一个属性进行读写 *** 作时,可以得到预期的值,也就是原子 *** 作不保证线程安全,例如:
在 Objective-C 中,可以在设置属性的时候,使用 atomic 来设置原子属性,保证属性 setter 、 getter 的原子性 *** 作,底层是在 getter 和 setter 内部使用 os_unfair_lock 加锁
在 Swift 中,原生没有提供原子 *** 作,可以使用 DispatchQueue 的同步函数来达到同样的效果
pthread 表示 POSIX thread ,是 POSIX 标准的 unix 多线程库,定义了一组跨平台的线程相关的API。 pthread_mutex 是一种用 C 语言实现的互斥锁,有单一的拥有者
递归锁是一种特殊互斥锁。递归锁允许单个线程在释放之前多次获取锁,其他线程保持睡眠状态,直到锁的所有者释放锁的次数与获取它的次数相同。递归锁主要在递归迭代中使用,但也可能在多个方法需要单独获取锁的情况下使用。
pthread_mutex 支持递归锁,只要把 attr 的类型改成 PTHREAD_MUTEX_RECURSIVE 即可,它有单一的拥有者
NSRecursiveLock 是以 Objective-C 对象的形式对 pthread_mutex(Recursive) 的封装,它有单一的拥有者
条件锁是一种特殊互斥锁,需要条件变量(condition variable) 来配合。条件变量有点像信号量,提供了线程阻塞与信号机制,因此可以用来阻塞某个线程,并等待某个数据就绪,随后唤醒线程。条件锁是为了解决 生产者-消费者模型
pthread_mutex 配合 pthread_cond_t ,可以实现条件锁,其中 pthread_cond_t 没有拥有者
NSCondition 是以 Objective-C 对象的形式对 pthread_mutex 和 pthread_cond_t 进行了封装, NSCondition 没有拥有者
NSConditionLock 是对 NSCondition 的进一步封装,可以设置条件变量的值。通过改变条件变量的值,可以使任务之间产生依赖关系,达到使任务按照一定的顺序执行,它有单一的拥有者(不确定)
读写锁是一种特殊互斥锁,提供"多读单写"的功能,多个线程可以同时对共享资源进行读取,但是同一时间只能有一条线程对共享资源进行写入
pthread_rwlock 有多个拥有者
性能从高到底分别是:
总结:
苹果官方文档
白夜追凶,揭开iOS锁的秘密
起底多线程同步锁(iOS)
深入理解 iOS 开发中的锁
如果你将mutex_c换成mutex_p,则不会死锁,因为,你第一个线程锁上后,切换到第二个线程,因为mutex_p未释放,第二个线程无法获取mutex_p,进入等待状态,此时OS将再次调度第一个线程,直到第一个线程释放mutex_p之后,第二个线程才会被激活,然后调试第二线程,获取mutex_p
使用OS提供的互斥量来保护公共资源还是比较安全的,但如果用二值信号量的话,就可能会有优先级反转的情况
首先初始化的锁为全局变量,为所有线程共享,你一个线程得到锁后自然而然就将其他线程阻塞了嘛,解锁后其他线程才能获取锁,理解哪个锁是一个阻塞性函数就ok,何必纠结呢,具体深挖掘的话就可以参照Linux环境高级编程了!
以上就是关于iOS 线程同步全部的内容,包括:iOS 线程同步、(C语言中)互斥锁的死锁问题、关于linux 线程互斥锁的问题,到底怎么锁的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)