oc多线程安全

多线程安全

一、多线程锁按照性能高低排序

加锁:读写在被多条线程同时访问时才需要加锁

  1. 加锁必须是同一把锁,线程要去把锁加锁
  2. os_unfair_lock
  3. OSSpinLock(已废弃)优先级反转:
  • thread1: 优先级高的后进来、发现锁被加了、会占用cpu处于忙等;
  • thread2:优先级低先进来、加锁
  • 线程调度:时间片轮转调度算法
  • 线程优先级
  • 尝试加锁、: try:加锁成功就加,加不成功就算了、继续走其他的
  1. dispatch_semaphore
  • 信号量:线程最大的并发数
  • wait 如果信号量的值>0,J就让信号量值-1,然后继续往下走
  • <= 0 , 就会休眠等待、直到信号量值变为> 0 ,就让信号量的值 减一,然后继续执行下面代码
  • signal, 某条线程 让 信号量 +1
  1. pthread_mutex
  2. dispatch_queue(DISPATCH_QUEUE_SERIAL)
  3. NSLock beforeDate:在这个时间之前等到这个锁、如果等到就加锁返回yes、
  4. NSCondition、条件锁、两个线程间依赖问题
  5. pthread_mutex(recursive) // 递归锁:允许同一个线程对一把锁进行重复加锁
  • pthread_mutex_trylock(&pLock) 加锁成功时返回0,否则返回一个错误提示吗;
  1. NSRecursiveLock

  2. NSConditionLock

  3. @synchronized(obj) // 内部对 mutex 递归锁的封装

  4. tryLock/lock 的使用:

  • trylock:当前线程锁失败也可以继续进行其他任务、
  • lock:只有锁成功后、才会做一些操作,

mutex: 互斥锁:会休眠

使用runloop是为了让现场保持激活状态;
线程执行任务结束:生命周期结束、无法再使用;
定时器是需要runloop去执行的,

  • 主队列:是串行的
  • 全局并发队列:四个、优先级不同
  • 使用sync往当前串行队列加任务,会卡主当前的串行队列(产生死锁)
  • performSelector : afterDelay: 这个方法本质是:往runloop中添加了一个定时器

你可能感兴趣的:(oc多线程安全)