GCD

作者: 溜溜的小枫 | 来源:发表于2018-04-10 21:38 被阅读0次

    三个概念:队列,线程,block块

    关系:一个队列对应一个或者多个线程,一个线程对应一个或者多个block块

    1 线程:一个CPU执行一组CPU命令列的路径就是线程。

        每一个dispatch_async或者dispatch_sync都是创建了一个线程并将队列添加到这个线程中(是否开辟新线程根据不同情况有不同注解《注解1》)

    2 队列:这是gcd对线程的封装,是一个执行队列。(先进先出顺序)

        队列分为serial和concurrent两种队列,serial是同步队列,concurrent是异步队列。(无论是那种队列,都是先进先出,只是有是否等待的区别)

    3 block块:他是具体的执行任务模块

    注解1:

    线程的分配是有系统根据不同创建函数以及不同的队列分配的,我们能干预,但是不能决定。

    对于dispatch_sync函数,他是将子线程同步的加到当前线程中。如果是将serial队列添加到线程中,同一个serial队列的block在同一个线程,不同的serial队列的block也是在同一个线程中执行;如果是将concurrent队列添加到线程中,同一个concurrent队列的不同block在不同的线程中,不同的concurrent队列的相同或者不同block在不同的线程中。

    对于dispatch_async函数,他是将子线程异步的加到当前线程中。如果是将serial队列添加到线程中,同一个serial队列的block在同一个线程,不同的serial队列的block不在同一个线程中执行;如果是将concurrent队列添加到线程中,同一个concurrent队列的不同block在不同的线程中,不同的concurrent队列的相同或者不同block在不同的线程中。

    注解2:

    dispatch_sync或者dispatch_async是一个函数,一个创建线程并将队列添加到线程中的函数。他的行为由注释1解释。他决定了当前线程和队列所在线程(根据注释1决定是否有新线程)的关系。(无论何种状况,第一次调用这些函数的时候是创建了新线程的)

    队列决定了block与block之间的关系。

    注释3:

    dispatch_sync和dispatch_async的

    实例理解:

    下面的操作都是第一次执行

    1    线程1中执行 dispatch_async() 是开辟一个线程2 并将queue加到这个线程2中,同时将线程2异步的加载到线程1中。

    2    线程1中执行 dispatch_sync() 是开辟一个线程2 并将queue加到这个线程2中,同时将线程2同步的加载到线程1中。

    3    线程1中执行 dispatch_sync() 开辟一个线程2。

          线程1中执行 dispatch_sync() 开辟一个线程3。(规定此次在必定开创新线程的情况下)

          dispatch_sync说明了线程2和线程1的关系。

          queue说明了线程2和线程3的关系

    相关文章

      网友评论

          本文标题:GCD

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