多线程
2020-07-24 本文已影响0人
Oh丶Really
- GCD
- NSOperation
- NSThread
- 多线程与锁
一、GCD
- 同步、异步 和 串行、并发
- dispatch_barrier_async(异步栅栏调用,解决多读单写问题)
- dispatch_group
1、同步、异步 和 串行、并发

同步串行
问题1:

原因:队列引起的循环等待

问题2:

分析:

问题3:

异步串行
异步并发
问题1:

分析:GCD下没有对应的RunLoop的,而performSelector方法会在对应的RunLoop下执行,又此时无对应的RunLoop,所以会失效
2、dispatch_barrier_async
问题:怎样利用GCD实现多读单写

模型:

解决代码:


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


二、NSOperation
需要和 NSOperationQueue 配合使用来实现多线程方案
- 添加任务依赖
- 任务执行状态控制
- 可以控制最大并发量
1.任务执行状态控制
哪些状态?
- isReady
- isExecuting
- isFinished
- isCancelled
状态的控制:
- 如果只重写main方法,底层控制变更任务执行完成状态,以及任务退出
- 如果重写了start方法,自行控制任务状态
问题:系统是怎样移除一个 isFinished = YES 的 NSOperation?
解答:通过KVO;
三、NSThread
启动流程:

Start方法实现原理:
- 内部创建了一个 pthread 线程,当执行的 tatrget 的 selctor 方法执行时,系统会进行线程的退出操作
- 如果想维持一个常驻线程,需要在 NSThread 对应的 selector 方法中维护一个 RunLoop 时间循环
四、多线程与锁
iOS中常用的锁:
- @synchronize
- atomic
- OSSpinLock
- NSRecursiveLock
- NSLock
- dispatch_semaphore_t
@synchronize
- 一般在创建单例对象的时候使用,来保证多线程情况下创建对象唯一
atomic
- 修饰属性关键字
- 对被修饰的对象进行原子操作(不负责使用)

OSSpinLock
- 自旋锁,循环等待询问,不释放当前资源
- 用于轻量级数据访问,例如简单的 int 值 +1/-1 操作
NSLock
- 一般用来解决线程同步问题
问题:

解决:-- NSRecursiveLock 递归锁

dispatch_semaphore_t
相关函数:

1、dispatch_semaphore_create()

2、dispatch_semaphore_wait()

3、dispatch_semaphore_sigal()

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