底层-多线程

2020-01-10  本文已影响0人  Stago

iOS中的常见多线程方案

GCD的常用函数

  • 用同步的方式执行任务
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block)
  • 用异步的方式执行任务
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
  • queue:队列
  • block:任务

GCD源码:https://github.com/apple/swift-corelibs-libdispatch

GCD的队列

容易混淆的术语

各种队列的执行效果

队列组的使用

多线程的安全隐患

  • 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源
  • 比如多个线程访问同一个对象、同一个变量、同一个文件

多线程安全隐患示例01 – 存钱取钱

多线程安全隐患示例02 – 卖票

多线程安全隐患分析

多线程安全隐患的解决方案

iOS中的线程同步方案

OSSpinLock
os_unfair_lock
pthread_mutex
dispatch_semaphore
dispatch_queue(DISPATCH_QUEUE_SERIAL)
NSLock
NSRecursiveLock
NSCondition
NSConditionLock
@synchronized

GNUstep

OSSpinLock

  • 如果等待锁的线程优先级较高,它会一直占用着CPU资源,优先级低的线程就无法释放锁

  • 优先级低的线程就无法释放锁
    需要导入头文件#import <libkern/OSAtomic.h>

os_unfair_lock

pthread_mutex

pthread_mutex – 递归锁

pthread_mutex – 条件

NSLock、NSRecursiveLock

NSCondition

NSConditionLock

dispatch_semaphore

dispatch_queue

@synchronized

iOS线程同步方案性能比较

os_unfair_lock
OSSpinLock
dispatch_semaphore
pthread_mutex
dispatch_queue(DISPATCH_QUEUE_SERIAL)
NSLock
NSCondition
pthread_mutex(recursive)
NSRecursiveLock
NSConditionLock
@synchronized

自旋锁、互斥锁比较

  • 预计线程等待锁的时间很短
  • 加锁的代码(临界区)经常被调用,但竞争情况很少发生
  • CPU资源不紧张
  • 多核处理器
  • 预计线程等待锁的时间较长
  • 单核处理器
  • 临界区有IO操作
  • 临界区代码复杂或者循环量大
  • 临界区竞争非常激烈

atomic

iOS中的读写安全方案

  • 同一时间,只能有1个线程进行写的操作
  • 同一时间,允许有多个线程进行读的操作
  • 同一时间,不允许既有写的操作,又有读的操作
  • pthread_rwlock:读写锁
  • dispatch_barrier_async:异步栅栏调用

pthread_rwlock

dispatch_barrier_async

上一篇 下一篇

猜你喜欢

热点阅读