1.iOS
开发中有多少类型的线程?分别对比
2.GCD
有哪些队列,默认提供哪些队列
- 1.主线程串行队列
- 2.全局并行队列
- 3.自定义队列(可自行设置
串/并
的参数DISPATCH_QUEUE_SERIAL
和DISPATCH_QUEUE_CONCURRENT
)
3.NSTimer、CADisplayLink、dispatch_source_t
的优劣
4.GCD
主线程 & 主队列的关系
- 主队列只在主线程中被执行的,而主线程运行的是一个
runloop
,不仅仅只有主队列的中的任务,还会处理 UI 的布局和绘制任务。
5.如何实现同步,有多少方式就说多少
dispatch_sync(dispatch_queue_t queue, DISPATCH_NOESCAPE dispatch_block_t block)
在某队列开启同步线程- dispatch_barrier_sync() 障碍锁的方式同步
- dispatch_group_create() + dispatch_group_wait()
- dispatch_apply() 插队追加 操作同步
- dispatch_semaphore_create() + dispatch_semaphore_wait() 信号量锁
- 串行NSOperationQueue队列并发数为1的时候 [NSOpertaion start] 启动任务即使同步操作 (NSOperationQueue.maxConcurrentOperationCount = 1)
pthread_mutex
底层锁函数- 上层应用层封装的NSLock
- NSRecursiveLock 递归锁,这个锁可以被同一线程多次请求,而不会引起死锁。这主要是用在循环或递归操作中
- NSConditionLock & NSCondition 条件锁
- @synchronized 同步操作 单位时间内只允许一个线程进入临界区
- dispatch_once() 单位时间内只允许一个线程进入临界区 …
6.dispatch_once
实现原理
- 底层只有控制参数
val
和回调方法block
,原理就是通过改变变量来达到核心方法只执行一次的效果。 - dispatch_once_f
- 这里先将
val
强转成dispatch_once_gate_t
类型的l
- 然后再根据
&l->dgo_once
判断是否已经执行过一次,如果已经执行过了,就直接返回 - 如果没用执行过就来到
_dispatch_once_gate_tryenter
:
- 这里先将
- 如果加锁成功了,则执行
_dispatch_once_callout
函数 _dispatch_once_gate_broadcast
函数是进行标记:_dispatch_once_mark_done
方法主要是将状态标记成DLOCK_ONCE_DONE
,等下次执行单例时方便判断
7.什么情况下会死锁
- 造成死锁的主要是 线程信息不对称,出现A等B的同时 B也在等A的情况.
- 其它的情况 都是资源产生竞争或者调用lock的函数没有调用unlock导致,异步线程 先后调用等产生的较多.
8.有哪些类型的线程锁,分别介绍下作用和使用场景
9.NSOperationQueue
中的maxConcurrentOperationCount
默认值
默认值 -1. 这个值操作系统会根据资源使用的综合开销情况设置.表示不进行限制,可进行并发执行