iOS 多线程

GCD

NSOperation(NSNetWorking和图片异步下载)

NSThread (常驻线程的实现)

多线程与锁(线程间同步和资源共享)

GCD

  • 同步/异步 和 串行/并发

  • dispatch_barrier_async

  • dispatch_group

  • GCD 同步/异步 和 串行/并发

  1. 同步串行

死锁,原因

另一个例子:

  1. 同步并发

答案:12345

  1. 异步串行

  1. 异步并发

dispath_barrier_async()

  • 多读单写怎么实现?
    读者和读者并发
    读者和写者互斥
    写者和写者互斥

异步栅栏调用

  • dispatch_group
    使用GDC实现需求ABC并发,并发执行完成后执行任务D
  1. 创建并发队列
  2. 创建一个group,执行在一组中
  3. dispatch_group_notify

NSOPeration

  • 特点
    可以添加以来(GCD和NSThread没有)
    任务执行状态控制
    设置并发量的控制

  • 执行状态控制
    isReady
    isExcusing
    isFinished
    isCancelled

如重写main方法,底层控制。
如重写start方法,我们自行控制状态。
源码分析

系统是通过KVO来移除一个isFinished=YES的NSOperation的

NSThread

启动流程
start -> 创建Pthread -> main() -> perforSelector (runloop) -> exict()

  • start方法
    创建函数,在main函数中创建一个for循环,实现一个常驻的线程

  • @synchronized
  • atomic
  • NSSpinlock
  • NSRecursiveLock
  • NSLock
  • dispatch_semaphore_t
  • @synchronized
    一半是使用单利对象使用的
  • atomic
    修饰属性和关键字
    原子性对复制操作有现成安全性

  • OSSpinLock自旋锁
    循环等待询问,不释放当前资源
    类似有个while循环

轻量级数据的访问,简单的int值+1 -1操作,系统使用自旋锁

  • NSLock

上锁和解锁成对出现

冲入原因死锁,换成递归锁:

  • NSRecursiveLock
    递归锁

  • dispatch_semaphore_t
    信号量

dispatch_semaphore_creat
dispatch_semaphore_wait(信号量,时间)
dispatch_semaphore_signal(信号量)

多线程

怎么用GCD实现单读多写?
几种多线程计数的特点?
GCD简单的多线程,NSOparation的点在第三方中用,NSThread是实现一个常驻线程
NSOperation对象在FInished之后怎么存quene中移除掉的?(KVO)
你用过设么锁?结合实际谈谈你怎么使用的?

你可能感兴趣的:(iOS 多线程)