开发中,咱们常用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 彼此等待,也便是咱们常说的死锁
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。


