美文网首页
六、多线程

六、多线程

作者: Miss_DQ | 来源:发表于2021-07-16 20:09 被阅读0次

    注:本文集为自己准备面试时,系统复习的笔记,如大家有兴趣,欢迎阅读并指正

    1.GCD

    • 同步/异步 和 串行/并发
      • 同步串行。在主线程运行
      • 同步并行。
      • 异步串行。
      • 异步并行。
    • dispatch_barrier_async
      • 实现多读单写?
        读者、读者并发
        读者、写者互斥
        写者、写者互斥
    -(id)objectForKey:(NSString *)key {
      __block id obj;
      dispatch_sync(concurrent_queue,^{
        obj = [userCenterDic objectForKey:key];
      });
      return obj;
    }
    
    - (void)setObject:(id)obj forKey:(NSString *)key {
      // 异步栅栏调用设置数据
      dispatch_barrier_async(concurrent_queue,^{
        [userCenterDic setObject:obj forKey:key];
      });
    }
    
    • dispatch_group_async()
      使用GCD实现需求:A、B、C三个任务并发,完成后在执行任务D?

    2.NSOperation

    需要和NSOperationQueue配合使用实现多线程方案

    • 添加任务依赖
    • 任务执行状态控制
      • 可以控制哪些装态?
        isReady 、isExecuting、isFinished、 isCancelled
        如果只重写main方法,底层控制变更任务执行完成状态,以及任务退出。
        如果重写了start方法,自行控制任务状态
    • 最大并发量

    3.NSThread:实现常驻线程

    启动线程
    start() - 创建pthread - main() - [target perfomSelector: withObject: ] - exit()

    4.多线程与锁:线程同步和资源共享

    • iOS有哪些锁?
      • @synchronized:用来创建单例对象的时候使用。保证多线程创建对象唯一
      • atomic:属性关键字,保障赋值操作线程安全
      • OSSpinLock:自旋锁,循环等待询问,不释放当前资源。专门用于轻量级数据访问,简单的+1/-1操作
      • NSLock:如果重入会出现死锁问题,需要使用递归锁。
      • NSRecursiveLock:递归锁
      • dispatch_semaphore_t:信号量
        • dispatch_semaphore_create();
        • dispatch_semaphore_singal();
    5.补充
    • 线程各自特点?
      GCD:简单的线程同步,子线程分派,多读单写问题解决
      NSOperation:AFN,SDW。方便任务的状态控制,添加依赖,移除依赖
      NSThread:常驻线程。

    • [self performSelector:withObject:afterDelay]:方法要被执行需要有runloop支持,子线程中执行该方法可能没有启动runloop导致该代码不执行。

    • NSOperation对象在Finished之后是怎样从queue当中移除掉的?
      通过KVO方式将对象从queue中移除

    • 你都用过哪些锁?结合实际谈谈你是怎样使用的?
      NSLock、dispatch_semaphore_signal

    相关文章

      网友评论

          本文标题:六、多线程

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