多线程

  • GCD
  • NSOperation
  • NSThread
  • 多线程与锁

一、GCD

  • 同步、异步 和 串行、并发
  • dispatch_barrier_async(异步栅栏调用,解决多读单写问题)
  • dispatch_group

1、同步、异步 和 串行、并发

image

同步串行

问题1:
image
原因:队列引起的循环等待
image
问题2:
image
分析:
image
问题3:
image

异步串行

异步并发

问题1:
image
分析:GCD下没有对应的RunLoop的,而performSelector方法会在对应的RunLoop下执行,又此时无对应的RunLoop,所以会失效

2、dispatch_barrier_async

问题:怎样利用GCD实现多读单写
image

模型:


image

解决代码:


image

image

3、dispatch_group

问题:使用GCD实现,A、B、C三个任务并发,完成后执行任务D?

代码:


image
image

二、NSOperation

需要和 NSOperationQueue 配合使用来实现多线程方案

  • 添加任务依赖
  • 任务执行状态控制
  • 可以控制最大并发量

1.任务执行状态控制

哪些状态?
  • isReady
  • isExecuting
  • isFinished
  • isCancelled
状态的控制:
  • 如果只重写main方法,底层控制变更任务执行完成状态,以及任务退出
  • 如果重写了start方法,自行控制任务状态
问题:系统是怎样移除一个 isFinished = YES 的 NSOperation?
解答:通过KVO;

三、NSThread

启动流程:


image

Start方法实现原理:

  • 内部创建了一个 pthread 线程,当执行的 tatrget 的 selctor 方法执行时,系统会进行线程的退出操作
  • 如果想维持一个常驻线程,需要在 NSThread 对应的 selector 方法中维护一个 RunLoop 时间循环

四、多线程与锁

iOS中常用的锁:

  • @synchronize
  • atomic
  • OSSpinLock
  • NSRecursiveLock
  • NSLock
  • dispatch_semaphore_t

@synchronize

  • 一般在创建单例对象的时候使用,来保证多线程情况下创建对象唯一

atomic

  • 修饰属性关键字
  • 对被修饰的对象进行原子操作(不负责使用)
image

OSSpinLock

  • 自旋锁,循环等待询问,不释放当前资源
  • 用于轻量级数据访问,例如简单的 int 值 +1/-1 操作

NSLock

  • 一般用来解决线程同步问题
问题:
image
解决:-- NSRecursiveLock 递归锁
image

dispatch_semaphore_t

相关函数:


image
1、dispatch_semaphore_create()
image
2、dispatch_semaphore_wait()
image
3、dispatch_semaphore_sigal()
image

总结:

  • 怎样用GCD实现多读单写?
  • 几种多线程技术和各自的特点?
  • NSOperation 对象在 Finished 之后怎样从 queue 中移除的?
  • 用过哪些锁?怎样使用的?

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