多线程知识梳理,通过了解多线程有关关键词,可以更好地方便了解多线程 ;稍后了解多线程的几种 解决方案 。
1.关键词: 进程、 线程;队列、任务;主线程、主队列、全局队列;同步、异步,多线程,线程锁,栅栏函数,信号量;and so on.
进程:狭义上讲,是系统中正在运行的一个程序。
广义上讲,是一个拥有独立功能的程序关于某个数据集合上一次运行活动。
线程:进程中执行的每一个任务都是一个线程。线程是进程中执行运算的最小单位。
主线程,每个进程默认都会开启一个线程,这个线程就是主线程。
多线程,一个进程中的多个任务,有多个线程去执行的情况。比如:我们使用音乐播放器,在听歌曲的同时下载音乐以及进行搜索。
任务:也就是一段代码块的集合,在GCD中就是一个block。任务按照执行方式划分,有同步任务(sync)、异步任务(async),主要的区别是否堵塞当前线程,是否创建新的线程。
同步任务,在前一个任务执行完成之后,才能执行下一个任务。不会创建新的线程,会堵塞当前线程。
异步任务,无需等待前一个任务执行完成,可以直接执行下一个任务,根据需要创建新的线程,不会堵塞当前线程。
队列:用于存放任务,是一系列任务的集合,决定任务的执行顺序,是并行还是串行?
并行队列,多个线程同时执行多个任务的情况。PS: 开启多条线程,执行多条下载任务,假定同时执行,在时间上是重叠的。
串行队列,主要针对于单个线程中(一个串行队列有且只有一个线程),任务依次执行的情况。PS:我们下载多个文件时,按照队列FIFO(先进先出)的顺序,任务A执行完成之后,再执行任务B,依次执行任务C。
主队列,负责调度主线程上的任务,没办法开启新的线程,任务都是顺序执行。主队列也就是我们UI所在的队列,我将断点放在viewLoad中,不难发现,系统除了默认给我们创建一个主线程外,还创建了一个Queue(serial)串行队列,我们在ViewContoller平时所在的操作,大部分就在这个队列中执行。
全局队列,本质上是一个并发队列,无需我们创建可以直接使用。可以设置优先级。
线程锁:多个线程访问时,采用了加锁机制对数据进行保护,防止多个线程同时访问一个数据,造成数据不正确,相互污染的情况。
栅栏函数:就像一道栅栏一样将任务隔开,栅栏函数之前的任务完成之后,再执行栅栏之后的任务。
信号量semaphore:是一种用来控制访问资源的数量标识。即告诉系统按照我们设定的信号量来创建线程的个数。
PS: 队列的执行顺序(并行/串行)与 是否创建新的线程无关。是否创建新的线程与任务的执行方式(同步/异步)有关系。
2.多线程实现的几种方案,主要包括pthread、NSThread、GCD、NSOperation。PS:其中pthread和NSThread需要我们管理生命周期,不是很常用,我们重点关注GCD和NSOperation。
方案 | 简介 | 语言 | 优点 | 缺点 | 使用频率 |
---|---|---|---|---|---|
pthread | 一套通用的多线程跨平台解决方案,适用于Linux、Unix、Max OS | C | 跨平台、可移植 | 使用难度大,需要程序员控制生命周期 | 少 |
NSThread | 苹果公司封装,更加面向对象,可以直接操作线程对象 | OC | 操作简单 | 需要程序员管理生命周期 | 少 |
GCD(Grand Central Dispatch) | 旨在替代NSThread的,充分利用设备的多核处理器的方案 | C | 1.自动管理生命周期。2.GCD主要与block结合使用,代码简洁高效。3.更接近于底层,速度更快 | 需要很多代码实现一些实用功能,比如设置任务的优先级 | 多 |
NSOperation | 基于GCD,又提供了更多简单实用的功能,更加面向对象 | OC | 1.比GCD简单易用,更加易读。2.可以方便管理并发、NSOperation之间的优先级 | 简单任务,代码量比GCD多 | 多 |
PS:参考文档,感谢下面作者的辛勤耕耘。
1.5个步骤,教你瞬间明白线程和线程安全
2.iOS开发的中的多线程 --- GCD