美文网首页
GCD 的原理和API应用

GCD 的原理和API应用

作者: Kiven_Berry | 来源:发表于2016-11-01 11:51 被阅读0次

什么是GCD:

Grand Central Dispatch 是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码 在系统级中实现。我们只需要把想要执行的代码添加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来是现实的,因此可以统一管理,也可执行任务。

在看下多线程:

我们写好代码,编译器编译为CPU命令(二进制代码),我们汇集这些CPU命令列和数据,将其作为一个app运行在Mac或iOS设备上。Mac OS(iOS)根据用户指示启动app后,首先将包含的CPU指令列配置到内存中去。然后从app指定的地址开始,一个个的执行命令,就这样的不断循环下去。由于CPU一次只执行一个命令(一个CPU核 执行的CPU命令列为一条五分叉的路径)。

当一个CPU核心执行多条“路径”上的不同命令,就为多线程。

举个例子:

执行中路径的状态,CPU的寄存器等信息保存到各自路径专用的内存块中,从切换目标路径专用的内存块中,复原CPU寄存器等信息,继续执行切换路径的CPU指令列,这被称为“上下文切换”

由于使用多线程的app可以在某个线程和其他线程之间反复多次进行上下文切换,因此看上去就好像一个CPU核 能够并列的执行多个线程一样。而在多核CPU中就是真的多核执行了。

多线程编程中会出现的问题:

多个线程更新相同的资源会导致数据的不一致(数据竞争)

停止等待事件的线程会导致多个线程相互持有等待(死锁)

使用太多线程会消耗大量的内存

线程的执行 在其内部有NSRunLoop的主循环执行。

优点:使用多线程编程,即使在执行长时间的任务的时候仍然可以保持用户界面的响应性能!!!

首先 Dispatch Queue按照追加的顺序(先入先出FIFO,First In First Out)执行处理。

dispatch_queue_t 是执行处理的等待队列,我们可以创建两种:

一种叫做Serial Dispatch Queue(串行队列)

执行1,等1结束执行2.

一种叫做Concurrent Dispatch Queue(并行队列)

执行1,不等1结束立刻执行2以此类推 (并行执行的任务数量由系统决定,即任务个数 CPU核心数,CPU负荷状态 决定)

iOS6以后不需要 dispatch_release()管理队列对象了。

相关文章

  • GCD 的原理和API应用

    什么是GCD: Grand Central Dispatch 是异步执行任务的技术之一。一般将应用程序中记述的线程...

  • GCD API 应用

    dispatch_queue_create OS X和iOS的核心XNU内核在发生操作系统事件时(如每隔一定时间,...

  • GCD API函数整理

    GCD API函数整理 GCD(Grand Central Dispatch)是异步执行任务的技术之一,一般将应用...

  • GCD

    问题 主要是runloop的原理以及核心源代码 gcd的原理及应用,source的原理为什么比timer更精准; ...

  • NSOperation、NSOperationQueue 学习

    NSOperation 和 GCD 对比 GCD 是基于C的底层的API,NSOperation 是基于 G...

  • OC底层原理24、GCD 的应用

    一、GCD的应用与应用原理 1、单例 - dispatch_once_f() 单例代码块: 源码搜索: 1.1、找...

  • GCD使用

    GCD 简介: 1> iOS和OS X的核心是XNU内核,GCD是基于XNU内核实现的 2> GCD的API全部在...

  • ios笔试的补充

    1.GCD和NSOperation的工作原理GCD的工作原理是:让程序平行排队的特定任务,根据可用的处理资源,安排...

  • iOS多线程编程之GCD详解(一)

    1. GCD简介 iOS开发中多线程的API主要有pthread,NSThread,NSOperation和GCD...

  • iOS 学习笔记一 多线程之NSOperation

    一、定义: GCD是基于C的底层API,而NSOperation则是封装GCD实现Objective-C API ...

网友评论

      本文标题:GCD 的原理和API应用

      本文链接:https://www.haomeiwen.com/subject/ohdmuttx.html