多线程相关面试题

120 阅读2分钟

1.iOS开发中有多少类型的线程?分别对比

image.png

2.GCD有哪些队列,默认提供哪些队列

  • 1.主线程串行队列
  • 2.全局并行队列
  • 3.自定义队列(可自行设置串/并的参数DISPATCH_QUEUE_SERIALDISPATCH_QUEUE_CONCURRENT)

image.png

image.png

3.NSTimer、CADisplayLink、dispatch_source_t 的优劣

image.png

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.有哪些类型的线程锁,分别介绍下作用和使用场景

image.png

9.NSOperationQueue中的maxConcurrentOperationCount默认值

默认值 -1. 这个值操作系统会根据资源使用的综合开销情况设置.表示不进行限制,可进行并发执行