美文网首页
iOS面试8 - 多线程

iOS面试8 - 多线程

作者: 奋斗的老王 | 来源:发表于2019-05-24 17:31 被阅读0次

GCD

  1. 同步异步, 串行并发

    • 同步串行: dispatch_sync(serial_queue, ^{ // work; })
      • serial_queue线程同步
      • 主线程同步串行
      • 产生死锁的原因
    • 异步串行: dispatch_async(serial_queue, ^{ // work; })
    • 同步并发: dispatch_sync(concurrent_queue, ^{ // work; })
    • 异步并发: dispatch_async(concurrent_queue, ^{ // work; })
      • performSelector..方法的内部逻辑(13)
        • 当perform...afterDelay:方法的内部实现, 是向当前线程的Runloop中添加事件, 因为GCD底层没有提供runloop, 所以该方法不会被执行
  2. dispatch_barrier_async: 异步栅栏调用, 用来处理多读单写系统层级的解决方案

    • 怎样实现多读单写? 怎样利用GCD实现多读单写?(多线程对于共享数据的访问问题)
    • 读与读并发, 读与写互斥, 写与写互斥
      • 异步栅栏实现多读单写
  3. dispatch_group的使用和理解:

    • dispatch_group的使用场景
    • dispatch_group代码示例

NSOperation

    1. 实现多线程的优势和特点:
    • 可以为任务添加依赖
    • 任务的执行状态控制
      • 可以控制哪些任务状态?
        • isReady: 当前任务是否处于就绪状态
        • isExecuting: 正在执行中
        • isFinished: 是否已完成
        • isCancel: 是否已取消
    1. 状态控制
    • 如果只重写main方法, 底层控制变更任务执行完成状态, 以及任务退出
    • 如果重写start方法, 自行控制任务状态, 因为在start方法, 系统帮我们控制了任务的状态
    1. 系统是如何移除一个isFinished=YES的NSOperation的?
    • 通过KVO
    1. 可以设置最大并发量

NSThread

启动流程
    1. 内部实现机制:
    • 创建一个线程
    • 通知Observer当前线程已经启动, 设置线程名称, 调用main函数, 在调用exit关系线程(所以需要在main中的SEL中添加一个runloop的循环)
    • main函数

多线程与锁

  • 锁的分类:
    1. @synchronized: 在创建单例对象的时候使用, 来保证再多线程的情况下创建对象是唯一的
      • 在创建单例对象的时候使用, 来保证再多线程的情况下创建对象是唯一的
      • 创建一个常驻线程的时候需要对线程进行加锁
    2. atomic: 属性关键字; 对被修饰的对象进行原子操作, 不负责使用, 负责赋值
    3. OSSpinLock: 自旋锁 -> 循环等待询问, 不释放当前资源; 用于轻量级数据访问, 简单的int值+/-操作
    4. NSLock: 解决细粒度的线程同步问题,来保证各个线程互斥, 来进入自己的临界区
      • 1-nslock.png
    5. NSRecursiveLock: 递归锁, 可以重入
      • 1-NSRecursiveLock.png
    6. dispach_semaphore_t: 信号量
      • 1-dispach_semaphore_t.png
      • dispach_semaphore_create() : 结构体中包含 信号量的值 和 线程列表
        • dispach_semaphore_create流程
      • dispach_semaphore_wait(semaphore, DIS) :
        • dispach_semaphore_wait内部流程
      • dispach_semaphore_singal() :
        • 1-dispach_semaphore_singal.png

多线程面试总结

  • 怎样利用GCD实现多读单写?
  • iOS为我们提供的几种多线程技术各自都有哪些特点?
  • NSOperation对象在Finished之后是怎样从queue中移除的?
  • 你都用过哪些锁, 结合实际谈谈你是如何使用的? !!!!

相关文章

网友评论

      本文标题:iOS面试8 - 多线程

      本文链接:https://www.haomeiwen.com/subject/szuveqtx.html