开发中,咱们常用GCD
来处理一些异步流程,感觉很熟悉,但是又很生疏。一些概念仍是很模糊,比方GCD
是什么,使命
是什么,串行行列
和并发行列
差异,同步
函数和异步
函数,行列和函数的合作运用,GCD
下层封装等等。本篇咱们来逐一分析。
1.GCD相关概念
1.1GCD
GCD
全称是 Grand Central Dispatch
,纯C
语⾔,提供了⾮常多强⼤的函数。
GCD
的优势:
-
GCD
是苹果公司为多核的并⾏运算提出的解决⽅案 -
GCD
会⾃动利⽤更多的CPU
内核(⽐如双核、四核) -
GCD
会⾃动办理线程的⽣命周期(创建线程、调度使命、毁掉线程) - 程序员只需要告知
GCD
想要执⾏什么使命,不需要编写任何线程办理代码
总结:GCD将使命增加到行列,并指定履行使命的函数。
1.2 使命
GCD
中使命
封装成了block
,block
没有参数也没有返回值。使命经过行列
的调度,由线程来履行。
使命是怎么封装并调用的呢?这是一个问题!
1.3 函数
履行使命的函数分为:异步函数和同步函数
-
异步函数
dispatch_async
- 不⽤等待当时句子执⾏结束,就可以执⾏下⼀条句子
- 会敞开线程执⾏
block
的使命 - 异步是多线程的代名词
-
同步函数
dispatch_sync
- 必须等待当时句子执⾏结束,才会执⾏下⼀条句子
- 不会敞开线程
- 在当时线程执⾏
block
的使命
1.4 行列
行列分为两种:串行行列
和并发行列
。不同的行列中,使命摆放的方式是不一样的,使命经过行列的调度,由线程池组织的线程来履行。
不管是串行行列
仍是并发行列
,都会遵从FIFO
的准则,即先进入先调度的准则
;使命的履行速度或者说履行时长,与各自使命的复杂度有关。
-
串行行列
:通路比较窄,使命依照一定的顺序进行摆放,一个一个履行 -
并发行列
:通道比较广,同一时间可有多个使命履行
行列是什么,怎么封装的,怎么调度使命的,这也是咱们需要研究的内容。
1.5 行列与函数
上面理解了行列、函数、使命的差异,行列用来调用使命,函数用来履行使命。那么行列和函数不同的合作会有怎样的运转效果呢?
-
同步函数串行行列
- 不会敞开线程,在当时线程中履行使命
- 使命串行履行,使命一个接着一个履行
- 会发生阻塞
-
同步函数并发行列
- 不会敞开线程,在当时线程中履行使命
- 使命一个接着一个履行
-
异步函数串行行列
- 会敞开一个线程
- 使命一个接着一个履行
-
异步函数并发行列
- 敞开线程,在当时线程履行使命
- 使命异步履行,没有顺序,
CPU
调度有关
2. GCD相关事例分析
2.1 主行列增加同步使命
在当时的主线程中增加一个使命,并同步履行该使命会怎么样呢?会崩
!见下图:
由于在当时的流程中,默认行列便是主行列
,也是一个串行行列
,使命履行的顺序是:
NSlog(@"0")
-
dispathc_sync
使命块 NSlog(@"2")
而此时第二步中的 块使命 dispathc_sync
与 mainThreadSyncTest
彼此等待,也便是咱们常说的死锁