OC的多线程1————关键词 以及 解决方案

多线程知识梳理,通过了解多线程有关关键词,可以更好地方便了解多线程 ;稍后了解多线程的几种 解决方案 。

1.关键词: 进程、 线程;队列、任务;主线程、主队列、全局队列;同步、异步,多线程,线程锁,栅栏函数,信号量;and so on.

进程:狭义上讲,是系统中正在运行的一个程序。

  • 广义上讲,是一个拥有独立功能的程序关于某个数据集合上一次运行活动。

线程:进程中执行的每一个任务都是一个线程。线程是进程中执行运算的最小单位。

  • 主线程,每个进程默认都会开启一个线程,这个线程就是主线程。

  • 多线程,一个进程中的多个任务,有多个线程去执行的情况。比如:我们使用音乐播放器,在听歌曲的同时下载音乐以及进行搜索。

任务:也就是一段代码块的集合,在GCD中就是一个block。任务按照执行方式划分,有同步任务(sync)、异步任务(async),主要的区别是否堵塞当前线程,是否创建新的线程。

  • 同步任务,在前一个任务执行完成之后,才能执行下一个任务。不会创建新的线程,会堵塞当前线程。

  • 异步任务,无需等待前一个任务执行完成,可以直接执行下一个任务,根据需要创建新的线程,不会堵塞当前线程。

队列:用于存放任务,是一系列任务的集合,决定任务的执行顺序,是并行还是串行?

  • 并行队列,多个线程同时执行多个任务的情况。PS: 开启多条线程,执行多条下载任务,假定同时执行,在时间上是重叠的。


    并行队列使用多个线程.png

    并行队列同时执行多个任务.png
  • 串行队列,主要针对于单个线程中(一个串行队列有且只有一个线程),任务依次执行的情况。PS:我们下载多个文件时,按照队列FIFO(先进先出)的顺序,任务A执行完成之后,再执行任务B,依次执行任务C。


    串行队列使用1个线程.png

    串行对象执行任务顺序.png
  • 主队列,负责调度主线程上的任务,没办法开启新的线程,任务都是顺序执行。主队列也就是我们UI所在的队列,我将断点放在viewLoad中,不难发现,系统除了默认给我们创建一个主线程外,还创建了一个Queue(serial)串行队列,我们在ViewContoller平时所在的操作,大部分就在这个队列中执行。


    图片.png

    图片.png
  • 全局队列,本质上是一个并发队列,无需我们创建可以直接使用。可以设置优先级。

线程锁:多个线程访问时,采用了加锁机制对数据进行保护,防止多个线程同时访问一个数据,造成数据不正确,相互污染的情况。

栅栏函数:就像一道栅栏一样将任务隔开,栅栏函数之前的任务完成之后,再执行栅栏之后的任务。

信号量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

你可能感兴趣的:(OC的多线程1————关键词 以及 解决方案)