GCD基本概念和Dispatch Queue

什么是GCD?Grand Central Dispatch或者GCD,是⼀一套低层API,提供了⼀一种新的⽅方法来进⾏行并发程序编写。从基本功能上讲,GCD有点像NSOperationQueue,他们都允许程序将 

任务切分为多个单⼀一任务然后提交⾄至⼯工作队列来并发地或者串⾏行地执⾏行。GCD⽐比之NSOpertionQueue更底层更⾼高效,并且它不是Cocoa框架的⼀一部分。 除了代码的平⾏行执⾏行能⼒力,GCD还提供⾼高度集成的事件控制系统。可以设置句柄来响应⽂文件描述符、mach ports(Mach port ⽤用于 OS X上的进程间通讯)、进程、计时

器、信号、⽤用户⽣生成事件。这些句柄通过GCD来并发执⾏行。 GCD的API很⼤大程度上基于block,当然,GCD也可以脱离block来使⽤用,⽐比如使⽤用传统c机制提供函数指针和上下⽂文指针。实践证明,当配合block使⽤用时,GCD⾮非常简

单易⽤用且能发挥其最⼤大能⼒力。

你可以在Mac上敲命令“man dispatch”来获取GCD的⽂文档。 为何使⽤用?

GCD提供很多超越传统多线程编程的优势:

  1. 易⽤用: GCD⽐比之thread跟简单易⽤用。由于GCD基于work unit⽽而⾮非像thread那样基于运算,所以GCD可以控制诸如等待任务结束、监视⽂文件描述符、周期执⾏行代码以及 ⼯工作挂起等任务。基于block的⾎血统导致它能极为简单得在不同代码作⽤用域之间传递上下⽂文。

  2. 效率: GCD被实现得如此轻量和优雅,使得它在很多地⽅方⽐比之专⻔门创建消耗资源的线程更实⽤用且快速。这关系到易⽤用性:导致GCD易⽤用的原因有⼀一部分在于你可以不 ⽤用担⼼心太多的效率问题⽽而仅仅使⽤用它就⾏行了。

  3. 性能: GCD⾃自动根据系统负载来增减线程数量,这就减少了上下⽂文切换以及增加了计算效率。

Dispatch Objects

尽管GCD是纯c语⾔言的,但它被组建成⾯面向对象的⻛风格。GCD对象被称为dispatch object。Dispatch object像Cocoa对象⼀一样是引⽤用计数的。使⽤用dispatch_release和 dispatch_retain函数来操作dispatch object的引⽤用计数来进⾏行内存管理。但注意不像Cocoa对象,dispatch object并不参与垃圾回收系统,所以即使开启了GC,你也必须⼿手 动管理GCD对象的内存。

Dispatch queues 和 dispatch sources(后⾯面会介绍到)可以被挂起和恢复,可以有⼀一个相关联的任意上下⽂文指针,可以有⼀一个相关联的任务完成触发函数。可以查 阅“man dispatch_object”来获取这些功能的更多信息。

Dispatch Queues

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

GCD中有三种队列类型:

  1. The main queue: 与主线程功能相同。实际上,提交⾄至main queue的任务会在主线程中执⾏行。main queue可以调⽤用dispatch_get_main_queue()来获得。因为main queue是与主线程相关的,所以这是⼀一个串⾏行队列。

  2. Global queues: 全局队列是并发队列,并由整个进程共享。进程中存在三个全局队列:⾼高、中(默认)、低、后台四个优先级队列。可以调⽤用 dispatch_get_global_queue函数传⼊入优先级来访问队列。优先级:

    #define DISPATCH_QUEUE_PRIORITY_HIGH 2

    #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0

    #define DISPATCH_QUEUE_PRIORITY_LOW (-2)

    #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

  3. ⽤户队列: 用户队列 (GCD并不这样称呼这种队列, 但是没有⼀一个特定的名字来形容这种队列,所以我们称其为⽤用户队列) 是⽤用函数 dispatch_queue_create 创建的 队列. 这些队列是串⾏行的。正因为如此,它们可以⽤用来完成同步机制, 有点像传统线程中的mutex。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值