iOS 并发概念浅析

在进行iOS开发过程中,我们常会遇到网络请求、复杂计算、数据存取等比较耗时的操作,如果处理不合理,将对APP的流畅度产生较大影响。除了优化APP架构,并发(concurrency)是一个常用且较好的解决方法,但并发涉及串行、并发、并行、同步、异步、多线程、GCD、NSOperation和NSOperationQueue等诸多容易混淆的概念,为求概念清晰明了,还请茗茶静坐,听我徐徐道来。

一、线程和任务

线程(thread) 和任务(task)是其他并发概念的基础,因此也是首要需理清的概念,以下是其要点,详细可参考Thread (computing)Task (computing))。

1)任务(task)

a)任务(task)是从程序中划分出来,可以独立执行的代码片段;
b)任务间可以添加依赖关系,如B任务依赖A任务,taskB.addDependency(taskA),这意味着B任务的执行以A任务完成为前提。

需要注意的是一个任务是否可以添加依赖,完全取决于任务封装类和其相关管理类的具体实现,GCD不支持任务依赖,NSOperationQueue就支持任务依赖。

下面的代码是对一个任务的简单封装,并支持任务间的依赖。

2)线程(thread)

a)线程(thread)是代码执行的独立路径,一条线程只能同时执行一行代码(一行代码,其实就是一条处理器命令)。
b)线程中代码管理是以任务(task)为单位,一条线程逐行执行一个任务中的代码(任务可以取消),完成后再逐行执行下一个任务中的代码。
c)一条线程跳出一个任务的执行,即意味着这个任务的完成。因此,一条线程不能执行taskA一段时间后,还未完成就开始执行taskB,然后又返回执行taskA(这其实是单线程内的并发,与单核处理器的并发概念相同,具体实践中不存在线程内并发)。

二、概念释疑

1)并行(parallelism)和并发(concurrency)

并发和并行都是指多个任务可以同时执行,都属于多线程编程概念,因此二者必然十分相近,容易混淆。二者区别只