薄荷冷冰冰

iOS的并行编程--<<并发编程:API 及挑战>>阅读笔记

前言

看weex看的头痛,现在看看自己熟悉的领域的东西,于是在Obj.c看到了这篇文章.

并发编程:API 及挑战-阅读笔记

说实话,在开发中,线程使用的话基本就是AF,GCD,最多还有不算真并行的RunLoop,但是真正从底层出现却了解不多,这几个月都是在写UI度过,
感觉应该看看这些了.

线程
线程(thread)是组成进程的子单元,操作系统的调度器可以对线程进行单独的调度。实际上,所有的并发编程 API 都是构建于线程之上的 —— 包括 GCD 和操作队列(operation queues)。

说到线程,我最先想到的居然是i7,i5,i3,什么4核8线程,4核4线程.多线程可以在单核CPU上同时运行,当然,如果CPU是多核,那么真正的并发运行.感觉这里文章写的比较矛盾,估计在后面会告诉原因.

你可以使用 Instruments 中的 CPU strategy view 来得知你的代码或者你在使用的框架代码是如何在多核 CPU 中调度执行的。

可能都觉得NSThread是最底层的封装了,殊不知NSThread 是 Objective-C 对 pthread 的一个封装。通过封装,在 Cocoa 环境中,可以让代码看起来更加亲切。例如,开发者可以利用 NSThread 的一个子类来定义一个线程,在这个子类的中封装需要在后台线程运行的代码。
对于NSThread的运行,笔者感觉使用的不多,最多通过isFinished判断线程是否结束.还有就是,是否是主线程.

直接使用线程可能会引发的一个问题是,如果你的代码和所基于的框架代码都创建自己的线程时,那么活动的线程数量有可能以指数级增长。这在大型工程中是一个常见问题。例如,在 8 核 CPU 中,你创建了 8 个线程来完全发挥 CPU 性能。然而在这些线程中你的代码所调用的框架代码也做了同样事情(因为它并不知道你已经创建的这些线程),这样会很快产生成成百上千的线程。代码的每个部分自身都没有问题,然而最后却还是导致了问题。使用线程并不是没有代价的,每个线程都会消耗一些内存和内核资源。

为了解决这个问题,GCDoperation queue运营而生,通过他们自身的线程池可以解决上述问题.

与NSThread不同的是,GCD并不复杂,通过Block就可以管理线程,同时也提出了队列这一概念去代替之前的线程问题.

之前在使用GCD的时候,都会直接创建自定义队列,无论是串行或者并列队列.但是今天发现,原来GCD公开有5个不同的队列,分别是

  1. 运行在主线程中的 main queue
  2. 3 个不同优先级的后台队列
  3. 一个优先级更低的后台队列(用于 I/O)

当然,在自定义队列中被调度的所有 block 最终都将被放入到系统的全局队列中和线程池中。

关于runloop,读之前,我理解的runloop,其实是关于生命周期,线程一直在执行,而RunLoop是不同的,则执行顺序也不一样.

无论何时你使用 run loop 来执行一个方法的时候,都需要记住一点:run loop 可以运行在不同的模式中,每种模式都定义了一组事件,供 run loop 做出响应。这在对应 main run loop 中暂时性的将某个任务优先执行这种任务上是一种聪明的做法。

后话

伴随着跟朋友在微信群吵架,今天结束了学习,感觉这样看比较枯燥,但是我感觉,生活正是因为有这些,才能对比出美好的美好.

加油