您的位置:首页 > 移动开发 > IOS开发

iOS 多线程 进程、线程、并发、串行、同步、异步—— iOS 编码复习(四)(多线程2)

2016-03-09 01:27 501 查看
什么是线程和进程?这个问题一直困扰着我。经过多番查询、思考、总结之后,终于总结了下我自己比较通俗的说法,一块给大家说说:

1:进程是指系统正在运行的一个应用程序;每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内,比如同时打开QQ\Xcode,系统就会分别启动两个进程,如果有Mac的人可以打开Mac系统中的活动监视器,那里就会显示说你的进程数,这个数量其实就是前台加后台的应用个数。

2:线程就是系统分配处理器时间资源的基本单元。其实“一条线程”就是完成特定功能的一个流程,是进程中一个单一顺序的控制流。比如下载电影和播放电影,它就是两条线程(也可以说是两个任务),注意这里不能通俗地理解为一个函数就是一条线程,一般的一条线程它要通过调用很多线程函数去执行。一个线程函数是用来执行一个小功能任务的,一条线程就是通过调用各个函数组成一个完成一序列特定任务的生产线,而线程就是完成这条生产线上的工人(注意这里一条线程和线程的区别)。

所以网上有一篇很形象化地理解进程和线程的文章(http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html)。它说进程就是一个生产车间,而线程就是车间里的工人,车间里的空间就是内存,所以每个线程都可以使用这些共享内存。但是有的地方只能有一个工人进入,比如厕所,而这就是互斥锁的概念;而有的地方只允许n个人进入,所以有人进入的时候,就应该计数,等到数量达到了限制,就不允许进入了,所以会有信号量的问题,而对于解决互斥和信号量问题就是我们平时编码当中的加锁了。(不过顺便要提醒一下,平时我们说的线程,往往说的是一条线程)

好,那我们再来看看串行、并发、同步、异步的理解:

首先,我们举个例子:加载N张网络图片,显示在界面中;

解析:既然是网络图片,那么肯定需要下载,每张图片之间没有关系,也就是说可以同时下载,所以使用并发队列;

  每张图片下载好之后要更新到界面上,这里有个前提是“图片下载好”,所以更新要等到网络下载结束之后,而这就是同步了。

  这里我们就接触到了并发与同步的概念,那么总结一下: 

  并发和串行是针对队列说的,队列1,2,3...是否可以同时进行,可以称为并发,不可以的就是串行;

  同步和异步是针对任务的,任务A,B,C...是否顺序执行,如果任务B必须使用任务A执行的结果,那就是同步,如果A和B之间没有前后因果关系,那么这就是异步。

OK,有了这些概念之后,那我们来看看多线程里是怎么体现这些个东西的呢?

按照上面的例子与那个工厂的类比,我们是不是可以这么理解:一条线程就是一条流水线,线程是工人,任务就是线程函数。

多线程指的就是多条线程,

线程串行通俗讲指的是一条线程(流水线)一次只分出一个任务;线程并发指的就是一条线程一次可以分发多个任务。

线程同步指的就是一条线程(流水线)所有任务都只能由当前一个工人(线程)完成,线程异步则一条线程表示可以由多个工人完成。

好,总结一下就是:同步异步指的是线程(工人),同步就表示不需要开启线程,串行并发指的是任务;

那么搭配起来通常是:

同步串行:流水线一次只分发一个任务,且有且只有一个工人完成;

同步并发:流水线一次分发多个任务,但是同样只有一个人完成;

异步串行:流水线一次可以分发一个任务,但是有多个人等待执行;

异步并发:流水线一次可以分发多个任务,而且有多个人等待执行;

那正好我看看到网上有一张图片很明了地解释了进程与线程的关系:



那我们可以很清楚地看到,工人Thread1执行了用户界面相关的东西,工人Thread2执行了两个任务:打开文件、读文件;那其实我们正常敲代码的时候也应该是主线程执行任何与用户界面有关的任务,然后二级线程应该执行缓慢的活着长时间的操作(例如读文件、网络请求等等)。

OK,这都是我个人总结,如有异议,请指出,谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息