一 GCD简介

GCD(Grand Central Dispatch)是苹果为实现并发编程提供的新技术。从基本功能上讲,GCD有点像NSOperationQueue,他们都允许程序将任务切分为多个单一任务然后提交至工作队列来并发地或者串行地执行。但是GCD比之NSOpertionQueue更底层更高效。

GCD的API很大程度上基于block,当然,GCD也可以脱离block来使用,比如使用传统c机制提供函数指针和上下文指针。实践证明,当配合block使用时,GCD非常简单易用且能发挥其最大能力,这也是我们经常在程序中使用的方式。

      GCD提供很多超越传统多线程编程的优势:
     
       a.易用: GCD比之thread更加简单易用。由于GCD基于工作单元(work unit)而非像thread那样基于运算,所以GCD可以控制诸如等待任务结束、监视文件描述符、周期执行代码以及工作挂起等任务。作为程序员只要一心关注自己的业务逻辑,可以从繁杂的线程管理的工作中解放出来。基于block的血统导致它能极为简单,可以在不同代码作用域之间传递上下文(闭包特性)。
       b.高效率: GCD被实现得如此轻量和优雅,使得它在很多地方比之专门创建消耗资源的线程更实用且快速。这关系到易用性:导致GCD易用的原因有一部分在于你可以不用担心太多的效率问题而仅仅使用它就行了。

       c.高性能: GCD自动根据系统负载(比例内存使用情况、CPU个数)来增减线程数量,它甚至可以在一个线程中实现多任务的并发,这就减少了上下文切换带来的开销,增加了计算效率。

   注意:1.GCD的层次比线程高,其底层是利用多线程来实现的,苹果将线程交给了系统去管理,这样任务的管理和执行比起线程来更加高效。
             2.使用者要做的是定义自己Task任务,然后将其放到合适的分发队列去执行。
             3.可以将GCD看作是一种更加轻量级的线程,类似于golang中的协程的概念。GCD的本质是在操作系统层面提供提供并行调度的,这样任务的切换效率要远高于内核的切换效率,它的大部分功能实在运行库里实现的。

二  GCD 分发队列

      尽管GCD是纯c语言的,但它被组建成面向对象的风格。GCD对象被称为dispatch object。Dispatch object像Cocoa对象一样是引用计数的。使用dispatch_release和dispatch_retain函数来操作dispatch object的引用计数来进行内存管理。

GCD的基本概念就是dispatch queue。dispatch queue是一个对象,它可以接受任务,并将任务以先到先执行(FIFO)的顺序来执行。dispatch queue可以是并发的或串行的。并发任务会像NSOperationQueue那样基于系统负载来合适地并发进行,串行队列同一时间只执行单一任务。





   注意:1. 分发队是FIFO原则来执行任务,但这并不能一定保证任务的最终执行完毕顺序也是按照添加顺序类进行(除非使用的是串行队列),这要看具体的任务内容。
             2.多个队列直间是并行执行的。
             3.提交到GCD的代码块可以有参数也可以没有,但是返回值必须是void
             4。如果任务用C函数进行封装的话 参数和返回值必须都为空  typedef void (*dispatch_function_t)(void *);


GCD中有三种队列类型:

1.Main Queue 主队列(UI队列): 与主线程功能相同。实际上,提交至main queue的任务会在主线程中执行。main queue可以调用dispatch_get_main_queue()来获得。因为main queue是与主线程相关的,所以这是一个串行队列。
2.Global Queue 全局队列(并发队列):可以同时执行一个或多个任务,而且这些队列是由整个进程共享。进程中默认会自动创建三个全局队列:高、中(默认)、低三个优先级队列。可以调用dispatch_get_global_queue函数传入优先级来访问队列。
3.Serial Qeue 用户自定义队列: 有两种,一种是自定义串行队列,一次只能执行一个任务;一种是自定义同步队列,可以并行执行多个任务。

     
 注意:1.global和main 分发队列由系统创建和管理,不用去关心引用计数,他们属于全局队列由系统去负责。
           2.对于自己创建的Serial Qeue需要自己去维护其引用计数(使用ARC就不用了)。

三 任务提交的方式

 向GCD中提交任务的方式分两种:
1.同步  dispatch_async
    用同步方式提交任务后, 会以阻塞的方式来执行任务,直到任务执行完毕才会顺序往下去执行下面的代码。
   例如:  

A ................... 
   dispatch_sync(mainQueue, TaskOne);
B .................
 
当执行完A代码片段后,向主队列提交了一个任务,这样会阻塞程序,直到TaskOne执行完毕后,才会执行B代码片段。

异步 dispatch_async
   提交任务后会立即返回,顺序往下执行。

例如:
A ................... 
   dispatch_async(mainQueue, TaskOne);
B .................
  
当执行完A代码片段后,向主队列提交了一个任务,这时不管TaskOne是否执行完毕,程序都会立即返回,执行B代码片段。



四 总结

       使用GCD可以极大的简化并行编程的方式,将底层的多线程交由系统去管理,这样可以充分利用多核硬件,提高程序的执行效率。下一节将使用代码详细介绍GCD使用。

IOS GCD 使用(一) 简介的更多相关文章

  1. iOS GCD基础篇 - 同步、异步,并发、并行的理解

    1.关于GCD - GCD全称是Grand Central Dispatch  - GCD是苹果公司为多核的并行运算提出的解决方案  - GCD会自动利用更多的CPU内核(比如双核.四核)  - GC ...

  2. iOS GCD之dispatch_semaphore(信号量)

    前言 最近在看AFNetworking3.0源码时,注意到在 AFURLSessionManager.m 里面的 tasksForKeyPath: 方法 (L681),dispatch_semapho ...

  3. iOS GCD 编程小结

    一.简单介绍 1.GCD简介? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD优势 GCD是苹果公司为多核的并行运算提出的 ...

  4. iOS GCD NSOperation NSThread等多线程各种举例详解(拷贝)

    2年多的iOS之路匆匆而过,期间也拜读来不少大神的博客,近来突然为自己一直做伸手党感到羞耻,是时候回馈社会.回想当年自己还是小白的时候,照着一些iOS多线程教程学,也只是照抄,只知其然.不知其所以然. ...

  5. ios - GCD简单小结

    首先GCD两个名词: 队列 同步异步. 队列: 任务放到队列,队列中的任务执行方式取决于执行队列中任务的方式---同步异步. 串行队列: 任务顺序执行,可以叫阻塞队列.只有前面任务完成才执行后面的. ...

  6. iOS GCD 与 NSOperationQueue

    NSOperationQueue ios NSOperation vs. GCD StackOverflow: NSOperation vs. Grand Central Dispatch Blog: ...

  7. IOS GCD 使用 (二)

     上一节,主要介绍了GCD的基本的概念,这节将用代码深入详细介绍GCD的使用. 一  使用介绍    GCD的使用主要分为三步:创建代码块;选择或创建合适的分发队列;(同步.异步方式)向分发队列提交任 ...

  8. IOS GCD 使用(三)单例模式

    一  Dispatch_once函数简介      使用dispatch_once提价的代码块,即便你提交多次,只能执行一次.    void dispatch_once(dispatch_once_ ...

  9. iOS——GCD多线程

    1> 概述 Grand Central Dispatch (GCD)是Apple开发的一种多核编程技术.主要用于优化应用程序以支持多核处理器以及其他对称多处理系统. GCD提供函数实现多线程开发 ...

随机推荐

  1. eclipse中mavean的使用配置

    eclipse-jee-neon-R-win32 maven-3.3.9 JDK  jdk-8u101-windows-i586 eclipse中配置mavean的步骤就不说了,网上很多教程,也很简单 ...

  2. OpenVPN下载、安装、配置及使用详解

    OpenVPN下载.安装.配置及使用详解   OpenVPN简介 OpenVPN是一个用于创建虚拟专用网络(Virtual Private Network)加密通道的免费开源软件.使用OpenVPN可 ...

  3. PHP漏洞全解(八)-HTTP响应拆分

    本文主要介绍针对PHP网站HTTP响应拆分,站在攻击者的角度,为你演示HTTP响应拆分. HTTP请求的格式 1)请求信息:例如“Get /index.php HTTP/1.1”,请求index.ph ...

  4. Angular2经典文章集锦

    Angular Metadata 等基础知识 http://www.jianshu.com/p/aeb11061b82c Metadata告诉Angular如何处理一个类,只有我们将它通告给Angul ...

  5. Spring+MyBatis实践—中文乱码

    多种中文乱码问题及解决: jsp页面乱码 表单提交乱码 URL中文参数乱码 1.jsp页面乱码解决(2步): 新建jsp页面: <%@ page language="java" ...

  6. 独立两套DJANGO+CELERY配置(生产+测试)时要注意的一些细节

    1,生产的NGINX环境,要指定自己的目录,而不是PROJ默认的. upstream ism_host { server ; } server { listen ; server_name local ...

  7. easyui源码翻译1.32--Tree(树)

    前言 使用$.fn.tree.defaults重写默认值对象.下载该插件翻译源码 树控件在web页面中一个将分层数据以树形结构进行显示.它提供用户展开.折叠.拖拽.编辑和异步加载等功能. 源码 /** ...

  8. QReadWriteLock 读写锁的区别

    QReadWriteLock 这个允许多个进程同时读,但是只有一个写.而且写读不能同时进行. 文档里语焉不详,这是我自己的理解: lockForWrite 为写而锁,就是要修改数据,外人连想进来读数据 ...

  9. linux下查看防火墙当前状态,开启关闭等

    从配置菜单关闭防火墙是不起作用的,索性在安装的时候就不要装防火墙 查看防火墙状态: /etc/init.d/iptables status 暂时关闭防火墙: /etc/init.d/iptables  ...

  10. S5PV210的IRAM应用

    准备分析   IRAM的大小96k,其实前两个程序都在这里运行的,程序都小于16K.要实现的是从把IRAM从的前16k从IRAM的起始地址0xD0020000拷贝到0xD0024000 处,调用mai ...