多线程之GCD概述
2019-02-28 本文已影响0人
梦里桃花舞倾城
1.GCD
简介
它是苹果推出的一套多线程解决方案,会合理的利用
CPU
、自动管理线程的生命周期。使用时只需要在block
中写入需要执行的代码即可。非常灵活!
GCD
的源码libdispatch
版本很多,源代码风格各版本都有不同,但大体逻辑没有太大变化。libdispatch
的源码下载地址在这里。
为什么要用GCD
?
-
GCD
可用于多核的并行运算 -
GCD
会自动利用更多的CPU
内核(比如双核、四核) -
GCD
会自动管理线程的生命周期(比如:线程创建、线程任务调度、线程销毁)
2.GCD
任务和队列
任务:
就是你需要执行的操作(即
block
代码块里面的内容)。执行任务有两种方式:同步执行和异步执行
-
同步任务
sync
:- 当前指令不完成,不会执行下个指令
- 只能在当前线程中执行任务,不具备开启新线程的能力
-
异步任务
async
:- 可以同时执行多个指令,不需要等待前一个指令完成
- 可以在新的线程中执行任务,具备开启新线程的能力。
举个简单例子:你要打电话给小明和小白。
同步执行就是:你打电话给小明的时候,不能同时打给小白,等到给小明打完了,才能打给小白(等待任务执行结束),而且只能用当前的电话(不具备开启新线程的能力)。
而异步执行就是:你打电话给小明的时候,不需要等和小明通话结束,还能直接给小白打电话,不用等着和小明通话结束再打(不用等待任务执行结束)。除了当前电话,你还可以使用其他所能使用的电话(具备开启新线程的能力)。
注意:异步执行(async
)虽然具有开启新线程的能力,但是并不一定开启新线程。这跟任务所指定的队列类型有关(下面会讲)。
队列(Dispatch Queue
): 用来存放任务,调度任务。队列是一种特殊的线性表,采用FIFO
(先进先出)的原则,即新任务总是被插入到任务的末尾,而读取任务总是从队列的头部开始读取。每读取一个任务,则从队列中释放一个任务。
在GCD
中有两种队列:串行队列 和 并发队列。两者都符合 FIFO
(先进先出)的原则。两者的主要区别是:执行顺序不同,以及开启线程数不同。
-
串行队列(
Serial Dispatch Queue
):- 一个接一个的调度任务(只开启一个线程,一个任务执行完毕后,再执行下一个任务)
-
并发队列(
Concurrent Dispatch Queue
):- 可以同时调度多个任务(可以开启多个线程,并且同时执行任务)
注意:并发队列的并发功能只有在异步函数(
dispatch_async
)下才有效
两者主要区别如下图所示:
串行队列.png并发队列.png
总结:
- 开不开线程,取决于执行任务的函数,同步不开,异步才能开。
- 开几条线程,取决于队列,串行开一条,并发可以开多条(异步)。
- 串行并发是根据任务来的
- 同步异步是根据线程来说的