- 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 中移除的?
- 用过哪些锁?怎样使用的?