GCD

作者: 开心一刻_ | 来源:发表于2018-12-02 13:32 被阅读0次

    GCD的底层实现

    基本理解

    最好的是开辟3-6条线程,根据cpu的内核执行
    异步:
    异步并发队列:并不一定每一个线程都会开启一条新线程,当达到一个最大数量的数量之后会增加限制
    异步串行队列: 只开辟了一个线程
    
    重点
    同步: 不会开辟一条子线程,要看同步的线程是否在子线程里。
    异步: 会开辟一条线程,也有可能复用当前已经空闲的线程。
    当前线程是哪一条就会阻塞哪一条。
    串行:只会创建一条新的线程,不包括现在的线程,还有一个特点:线程里面的任务是一个一个执行的(也就是里面的线程是一个一个执行的)
    并发:会创建很多线程,会出现复用已经用完的子线程的情况。
    
    分析所有的问题都根据线程来分析。
    

    并发:同步的话,任务按顺序执行。
    异步:真正的并发。

    同步和异步:能不能开辟一个线程。
    串行和并发:针对的是队列。
    最终的执行顺序:取决于他们的组合。

    NSThread和gcd区别

     NSThread: 需要自己管理线程的生命周期
    GCD:自动管理
    

    死锁:

    两个人物相互等待
    
    1. 主线程是串行队列。(串行队列的特点,是要等一个任务走完另一个任务才可以执行)
    2. 在主线成里面用异步不会开辟子线程。
    3. 需要等到主线成中的任务执行完才会执行主队列重点任务。

    两个线程走完然后执行另一个方法

    1.  dispatch_group_enter  dispatch_group_leave, dispatch_group_notify, 
    配合使用
    2. (栅栏)barrier 。
    3. 自己手动代码控制。
    

    线程安全:读取到的结果是可预见的
    线程不安全:读取到的结果是不可预见的。

    线程锁

    线程锁:保证数据的安全
    常用锁:信号量、NSLock、@synthesnise
    线程锁的原理:确保只有一条线程在执行数据的读取。
    dispatch_semaphore_t: 限制线程的并发数
    

    atomic和nonatomic

    1. 为什么不用atomic
      automic等的set和get方法可以使用automic
      因为它并不能保证线程安全,而且耗性能

    只能保证简单的set和get线程安全,如果增加了一些运算的操作就不是线程安全的了。
    比如number++这样的操作,最后的结果不确定所以就是线程不安全的。
    而且uilable等控件都是在主线成上面的,不存在所谓的线程安不安全,所以都应该用noautomic。

    锁的区别

    @synchronized

    性能较差不建议使用,会隐式添加异常处理机制,如果代码报异常会释放该锁。
    

    NSLock

    锁定某一个资源
    

    semaphore

    信号量=1的时候就是互斥锁了。
    它还可以调度线程(控制线程的最大并发数)
    

    相关文章

      网友评论

          本文标题:GCD

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