iOS 线程同步

iOS 线程同步,第1张

要保证线程安全,就必须要线程同步,而在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 线程互斥锁的问题,到底怎么锁的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9871047.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存