Grand Central Dispatch(GCD)技术让任务并行排队执行,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务。任务可以是一个函数(function)或者是一个block。 GCD的底层依然是用线程实现,不过这样可以让程序员不用关注实现的细节。

GCD中的队列称为dispatch queue,它可以保证先进来的任务先得到执行通过它能够大大简化多线程编程。工程师只要将要执行的任务(执行代码块)放入队列中,GCD将会为需要执行的任务创建thread,从而放入dispatch queue中,当将任务添加到队列立即安排开始执行。

任务:其是并发程序的执行单位;队列:其是并发程序的管理单位。

第一个程序 Object-C 语言

int main(int argc, const char * argv[]) {//创建队列dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//添加block任务dispatch_async(queue, ^{printf("hello world\n");});sleep(2); //若不休眠2秒,主线程就会退出,导致dispatch queue线程也退出。return 0;
}
输出:hello world

Dispatch queue的实现机制是基于C实现的,并且GCD自动为用户提供了一些dispatch queue,当然也可以自定义一些queue。其中queue类型只有三种:Serial、Concurrent和Main dispatch queue。

Type

Description

Serial(串行)

又称为private dispatch queues,同一时刻只执行一个任务,并按添加到serial的顺序执行。当创建多个Serial queue时,虽然它们各自是同步执行的,但Serial queue与Serial queue之间是并发执行的。Serial queue通常用于同步访问特定的资源或数据。

Concurrent(并行)

又称为global dispatch queue,同一时刻可执行多个任务,任务开始执行的顺序按添加的顺序执行,但是执行完成的顺序是随机的,同时可以创建执行的任务数量依赖系统条件。

Main dispatch queue(主队列)

它是全局可用的serial queue,它是在应用程序主线程上执行任务的

并行队列

由于系统已经为每个应用程序创建了四个不同优先级的Concurrent dispatch queue,用户不需要创建Concurrent dispatch queue,只需通过dispatch_get_global_queue 函数获得就可以,其声明如下:

dispatch_queue_t dispatch_get_global_queue(long identifier,long flags);

  • identifier:该属性用于设置queue优先级,有DISPATCH_QUEUE_PRIORITY_HIGH, DISPATCH_QUEUE_PRIORITY_DEFAULT,DISPATCH_QUEUE_PRIORITY_LOW,DISPATCH_QUEUE_PRIORITY_BACKGROUND;
  • flags:该属性是保留值,目前只需设置为0。

PS:虽然dispatch queue是reference-counted对象,但是由于是全局对象,所以不需要手动进行retain 和 release。

dispatch_queue_t相关推荐

  1. App性能分析数据监控

    App性能分析数据监控 APP的性能监控包括: CPU 占用率.内存使用情况.网络状况监控.启动时闪退.卡顿.FPS.使用时崩溃.耗电量监控.流量监控等等. 文中所有代码都已同步到github中,有兴 ...

  2. iOS视频硬编码技术

    iOS视频硬编码技术 一.iOS视频采集硬编码 基本原理 硬编码 & 软编码 硬编码:通过系统自带的Camera录制视频,实际上调用的是底层的高清编码硬件模块,即显卡,不使用CPU,速度快 软 ...

  3. dispatch_queue_create(com.biostime.xxx, DISPATCH_QUEUE_SERIAL)的陷阱

    代码 for(int i =0;i<10;i++)     {         NSLog(@"i=%d",i);         dispatch_queue_t mySe ...

  4. 1小时学会:最简单的iOS直播推流(三)使用系统接口捕获音视频数据

    最简单的iOS 推流代码,视频捕获,软编码(faac,x264),硬编码(aac,h264),美颜,flv编码,rtmp协议,陆续更新代码解析,你想学的知识这里都有,愿意懂直播技术的同学快来看!! 源 ...

  5. 【如何快速的开发一个完整的iOS直播app】(采集篇)

    前言 在看这篇之前,如果您还不了解直播原理,请查看这篇文章如何快速的开发一个完整的iOS直播app(原理篇) 开发一款直播app,首先需要采集主播的视频和音频,然后传入流媒体服务器,本篇主要讲解如何采 ...

  6. 09-dispatch_source

    dispatch_source 是BSD系内核惯有的kqueue的包装,kqueue 是XNU内核中发生各种事件时,在应用程序编程中执行处理的技术. CPU 负荷非常小,尽量不占用资源. dispat ...

  7. 08-dispatch_apply

    1 dispatch_apply dispatch_apply 是按照指定的次数将指定的block 添加到指定的queue当中去. 可以用于快速的迭代 // 获取全局并发队列dispatch_queu ...

  8. 07-主队列和全局队列

    GCD 会主动的提供一个队列供开发者使用. 主队列 系统提供的串行队列 是在主线程执行的队列,所以是串行的队列.任务一个个执行. dispatch_get_main_queue() 全局队列 系统提供 ...

  9. 02-dispatch_barrier

    1 dispatch_barrier_async 概念 栅栏方法,暂时的将一部操作做成一个同步操作,向一个栅栏一样的分开 dispatch_barrier_async函数的作用是在进程管理中起到一个栅 ...

最新文章

  1. CQRS及.NET中的参考资料
  2. java 泛型集合应用_Java泛型集合的应用和方法
  3. IntelliJ IDEA快捷键(Shortcut)官方文档地址
  4. java map reduce 原理_MapReduce实现原理详解
  5. 从 GMM 到 EM 算法
  6. HDOJ(HDU) 1785 You Are All Excellent(角度运算)
  7. avast! Virus Cleaner 1.0.210
  8. easy poi 模板生成多表excel
  9. 输入法变成繁体后改回简体中文
  10. 什么是503服务不可用错误(以及如何解决)?
  11. 服务器软件firmware的作用(BIOS、BMC、PSOC、CPLD)
  12. 文档类型字符集即HTML标签的语义化
  13. 超融合架构真的完美吗?
  14. Python中制表符\t的使用
  15. 监控摄像头接入GB28181平台实现监控视频直播的详细搭建流程
  16. Unity游戏开发:3D冒险游戏项目实战
  17. 基于Python/Capl脚本 对通信矩阵报文(Flexray/Can)的周期检测(二)
  18. 移动端h5 实现多个音频播放
  19. java系统学习_java全面系统学习路线(转载)
  20. Android 下获取 ICCID、电话号码 的两种方式

热门文章

  1. 【转】CentOS 6.0 图形(图解)安装教程、基本配置、网络配置、软件源配置、安装压缩、语言包...
  2. CodeBlocks修改控件图标大小
  3. 马年宝宝取名的几点技巧
  4. 深度学习与自然语言处理教程(9) - 句法分析与树形递归神经网络(NLP通关指南·完结)
  5. TIMIT数据集-语音人工标签-波形频谱可视化展示
  6. 【机器学习】boosting集成学习Adaboost
  7. 自由落下的小球python_python开发的小球完全弹性碰撞游戏代码_python_脚本之家
  8. Java时间相关的对象和方法
  9. nova launcher_如何使用Nova Launcher从Android的应用程序抽屉中隐藏应用程序
  10. 门锁被智能化之后,水龙头也被AI锁定,用深度学习提醒节约用水了解一下