GCD 的一点疑惑与自解

GCD 其实已经了解了很久了,在实际工程中也会经常用,但是其实很多实践都是浅尝辄止。

最近又在回头看这块儿的内容,有一些知识点,原来不甚明白的,现在有了新的认识,刚好也记录下。

GCD 是一套方案,GCD 本身管理了一组线程池,GCD 负责线程池中的线程创建销毁、并且这种能力是动态化的,即可以充分利用当前 CPU 的多核特性。
添加到 GCD 队列中的任务,会由 GCD 来决定运行在哪一个线程上。也就是说,GCD Queue 是一个抽象概念, task 是添加到 Queue 中不假,但是实际仍然是运行在线程上的。

GCD Concurrent Queue 并行队列

GCD 的队列中的 task 遵循 FIFO (First In First Out)原则,但是 task 完成的顺序是不可测的。

上面的这段描述,是在当时阅读官方文档的时候,产生了疑惑,我的想法是,既然 task 是按照先后添加到 Queue 中的顺序进行执行的,那为啥完成时间就不一定了呢?

现在明白了,task 的执行压根和 Queue 关系不大,GCD 只是按照添加顺序从 Queue 中一个个拿出 task,扔到线程上去执行。有的 task 一会就完成了,有的需要比较长的时间,当然这个完成顺序就不一定了。

现在想想,当时应该是想当然的认为 GCD 只有在完成上一个任务后才会开启下一个任务,跟串行队列混淆了,从而导致疑惑的。

GCD 串行队列

串行队列就是只有完成上一个 task ,才会进行下一个 task 的执行。
所以完成顺序与添加顺序是相同的。

Objc GCD 队列疑惑

gcd-queues.png

上图是摘录自 Objc.cn 中关于 GCD 队列的一张图。
但是在阅读时,我有下面几点疑惑:

  • 为什么 Custom Queues 这一层的关系如此复杂。
  • 为什么 Serial Queue 既指向了 Serial Queue ,又能指向 Concurrent Queue。
  • 最上面一层中的 Serial Queue 和 倒数第二层中的 Queues 有什么关系。

GCD 公开有 5 个不同的队列:运行在主线程中的 main queue,3 个不同优先级的后台队列,以及一个优先级更低的后台队列(用于 I/O)。 另外,开发者可以创建自定义队列:串行或者并行队列。自定义队列非常强大,在自定义队列中被调度的所有 block 最终都将被放入到系统的全局队列中和线程池中。

Objc 原文如上描述。

细细品味,其意思是,GCD Queues 有 5 大钦定的 Queue。
开发者当然也可以自定义 Queue(使用 dispatch_queue_create 函数), 前面说过,Queue 是一个抽象概念,只是简单的保存 task 而已,最终 task 还是要在 GCD Thread Pool 中完成的。

目标队列 Target Queue

之前讲过,task 最终是要从 Queue 中放到线程池中执行的。
其实还有一种情况,就是 task 可以从一个 Queue 中放到另一个 Queue 中。
需要设置当前 Queue 的 TargetQueue。
了解了这个概念,就能很清楚的明白上面的图了。

为了更加清楚的阐述这张图的表达意图,可以从这几条线说起:

S1 -> Main Queue

MainQueue 这个队列中的 task 最终都会放到主线程上执行。如果所示,MainQueue 是指向 Main Thread。
也就是说,如果自定义队列时,如果这个自定义串行队列的 Target Queue 是 Main Queue,那么这些 task 将都会放在主线程执行。

S3 -> Default Priority Queue

这里的意思很简单,自定义队列的默认 Target Queue 就是 Default Priority Queue,这也就是 Objc 所解释的 在自定义队列中被调度的所有 block 最终都将被放入到系统的全局队列中和线程池中
在 S3 队列中的任务,会一个接着一个地放入到 Global Queue 中,然后被执行。在前一个 task 完成之后,才会继续下一个 task。

C2 -> Default Priority Queue

同上,不过这里,会一咕噜的将 C2 中的 task 往 Global Queue 中放,不用管上一个 task 是否完成。

S2 -> S3

Serial Queue 的 target queue 同样是 Serial Queue

C1 + S4 -> C2

C1 的 Concurrent Queue 的 target queue = Concurrent Queue
这个就比较高级了。
在这个模式下,S4 中的 task 串行,C1 中的 task 并行。
但是最终它们这些任务都放在一个并发队列中。

最后

以上是个人对于 GCD 的一些见解,如有描述不对,还请及时指正。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容