iOS 中的锁

127 阅读1分钟

image.png

互斥锁和自旋锁的区别

  • 互斥锁,抢不到资源的线程会休息,由 CPU 去唤醒
  • 自旋锁,抢不到资源的线程会自己旋转,自己判断有没有抢到,不劳 CPU 费心,所以效率高

互斥锁

又分为可重入锁(NSRecursiveLock)、非可重入锁(其他锁)

  1. atomic 关键字的原理就是互斥锁,具体实现是 os_unfair_lock (iOS 10 之前是自旋锁 OSSpinLock,因为有线程安全问题后来就改了)
  2. pthread_mutex 也是 C 语言下的互斥锁,
  3. @synchronized 也是互斥锁,性能最差
  4. NSLock 也是互斥锁,pthread_mutex_lock 的封装,比它多了个「超时」的功能,超时是用来解决可能出现的死锁问题的。
  5. NSRecursiveLock 处理递归情况:可以被同一个线程多次获取而不会死锁
  6. dispatch_semaphore_t 信号量,用于控制 GCD 最大并发数,不同线程之间锁定和解锁操作。适用于生产者消费者模型
  7. NSCondition 跟信号量类似。
  8. NSConditionLock 条件锁,适合生产者消费者模型,

自旋锁

自旋锁,抢不到资源的线程会自己旋转,自己判断有没有抢到,不劳 CPU 费心,所以效率高

  1. 读写锁 pthread_rwlock_t 就是一种自旋锁。平时少用,一般用 栅栏函数解决读写的线程问题
  2. OSSpinLock ,

其他

  • 可以用 Thread Sanitizer 检测线程安全问题
image.png

参考资料

iOS 中为什么会有这么多锁呢?:介绍锁的用处,写得好

iOS 探索 多线程面试题分析: 可以重读下

iOS 探索 细数 iOS 中的那些锁: 有源码分析