开发中,咱们常用GCD来处理一些异步流程,感觉很熟悉,但是又很生疏。一些概念仍是很模糊,比方GCD是什么,使命是什么,串行行列并发行列差异,同步函数和异步函数,行列和函数的合作运用,GCD下层封装等等。本篇咱们来逐一分析。

1.GCD相关概念

1.1GCD

GCD全称是 Grand Central Dispatch,纯C语⾔,提供了⾮常多强⼤的函数。

GCD的优势:

  • GCD 是苹果公司为多核的并⾏运算提出的解决⽅案
  • GCD 会⾃动利⽤更多的CPU内核(⽐如双核、四核)
  • GCD 会⾃动办理线程的⽣命周期(创建线程、调度使命、毁掉线程)
  • 程序员只需要告知 GCD 想要执⾏什么使命,不需要编写任何线程办理代码

总结:GCD将使命增加到行列,并指定履行使命的函数。

1.2 使命

GCD使命封装成了blockblock没有参数也没有返回值。使命经过行列的调度,由线程来履行。

使命是怎么封装并调用的呢?这是一个问题!

1.3 函数

履行使命的函数分为:异步函数和同步函数

  • 异步函数dispatch_async

    • 不⽤等待当时句子执⾏结束,就可以执⾏下⼀条句子
    • 会敞开线程执⾏ block 的使命
    • 异步是多线程的代名词
  • 同步函数dispatch_sync

    • 必须等待当时句子执⾏结束,才会执⾏下⼀条句子
    • 不会敞开线程
    • 在当时线程执⾏ block 的使命

1.4 行列

行列分为两种:串行行列并发行列。不同的行列中,使命摆放的方式是不一样的,使命经过行列的调度,由线程池组织的线程来履行。

不管是串行行列仍是并发行列,都会遵从FIFO的准则,即先进入先调度的准则;使命的履行速度或者说履行时长,与各自使命的复杂度有关。

  • 串行行列:通路比较窄,使命依照一定的顺序进行摆放,一个一个履行
  • 并发行列:通道比较广,同一时间可有多个使命履行

OC 底层原理 20:GCD函数和队列

行列是什么,怎么封装的,怎么调度使命的,这也是咱们需要研究的内容。

1.5 行列与函数

上面理解了行列、函数、使命的差异,行列用来调用使命,函数用来履行使命。那么行列和函数不同的合作会有怎样的运转效果呢?

  • 同步函数串行行列

    1. 不会敞开线程,在当时线程中履行使命
    2. 使命串行履行,使命一个接着一个履行
    3. 会发生阻塞
  • 同步函数并发行列

    1. 不会敞开线程,在当时线程中履行使命
    2. 使命一个接着一个履行
  • 异步函数串行行列

    1. 会敞开一个线程
    2. 使命一个接着一个履行
  • 异步函数并发行列

    1. 敞开线程,在当时线程履行使命
    2. 使命异步履行,没有顺序,CPU调度有关

2. GCD相关事例分析

2.1 主行列增加同步使命

在当时的主线程中增加一个使命,并同步履行该使命会怎么样呢?会崩!见下图:

OC 底层原理 20:GCD函数和队列

由于在当时的流程中,默认行列便是主行列,也是一个串行行列,使命履行的顺序是:

  1. NSlog(@"0")
  2. dispathc_sync使命块
  3. NSlog(@"2")

而此时第二步中的 块使命 dispathc_syncmainThreadSyncTest 彼此等待,也便是咱们常说的死锁