回顾
在前两篇博客,已经介绍了进程
和线程
,还介绍了自旋锁
和互斥锁
等相关内容,在 iOS 开发中,使用最多的还是 GCD
,那么从本篇开始讲陆续介绍 GCD
。
iOS底层探索之多线程(一)—进程和线程
iOS底层探索之多线程(二)—线程和锁
1. 什么是 GCD
GCD定义
Grand Center Dispatch
简称GCD
,是苹果公司开发的技术,以优化应用程序支持多核心处理器。
- 纯
C
语言,提供了非常多期待的函数。 -
GCD
是苹果公司为多核的并行运算出的解决方案。 -
GCD
会自动利用更多的CPU
内核(比如双核、四核) ,GCD
会自动管理线程的生命周期(创建线程、调度任务、销毁线程) - 程序员只需要告诉
GCD
想要执行什么任务,不需要编写任何线程管理代码。
GCD
将任务添加到队列,并且指定执⾏任务的函数
GCD工作原理
GCD
的两个核心:任务
和队列
2. 任务和队列
任务
:需要执行什么操作
队列
:用来存放任务的
GCD
使用的两个步骤:创建任务、将任务添加到队列
- 创建任务:确定要做的事情
- 将任务添加到队列中
-
GCD
会自动将队列中的任务取出来,放到对应的线程中去执行。 - 任务的取出遵循
FIFO
原则:先进先出,后进后出。
-
串行队列
串行队列
(Serial Dispatch Queue),任务一个接着一个的执行,一个任务执行完毕后,再执行下一个任务,串行队列是顺序执行
的。
-
串行队列示意图:
并发队列
并发队列
(Concurrent Dispatch Queue),可以让多个任务并发(同时
)执行,自动开启多个线程同时执行任务。并发功能只有在
异步(dispatch_async)函数
下才有效。
- 并发队列示意图:
并发队列,先调度执行的不一定先执行完成,这和CPU
分配的时间有关系,还和任务的大小有关,在分配的时间内没有完成,CPU
:老铁你先靠边站会,让下一个哥们先执行,下次分配到你时间再继续执行吧。
3. 函数
- 任务使用
block
封装 - 任务的
block
没有参数也没有返回值 - 执行任务的函数
异步dispatch_async
- 不用等待当前语句执行完毕,就可以执行下一条语句
- 会开启线程执行
block
的任务 - 异步是多线程的代名词
同步dispatch_sync
- 必须等待当前语句执行完毕,才会执行下一条语句
- 不会开启线程
- 在当前执行
block
的任务
(1) 让程序平行排队的特定任务,根据可用的处理资源,安排他们在任何可用的处理器核心
上执行任务 。
(2) 一个任务可以是一个函数,是一个闭包体GCD
的底层此意使 用线程实现的,不过这样可以让程序员不用关注实现的细节。
(3) GCD
中必须要使用的是各种队列
,我们遇过block
,把具体的代码放到队列
中,队列中的任务排队执行
,系统会自动的把队列中的具体任务分配到具体的线程中和CPU
中(如果是多核处理器),具体创建多少个线程,分配到哪个线程都是由系统管理
。
更多内容持续更新
喜欢就点个赞吧
觉得有收获的,可以来一波,收藏+关注,评论 + 转发,以免你下次找不到我
欢迎大家留言交流,批评指正,互相学习,提升自我