文档章节

Objective-c并发编程 -- GCD基础

Japer1987
 Japer1987
发布于 2017/02/01 22:39
字数 637
阅读 214
收藏 9

什么是GCD

  • 全称是 Grand Central Dispatch
  • 纯C语言, 提供了非常强大的函数

GCD的优势

  • 是苹果公司为多核的并行运算提出的解决方案
  • 会自动利用个多的CPU内核
  • 会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
  • 程序员只需要告诉GCD想要执行什么任务, 不需要编写任何线程管理代码

任务与队列

  • 任务: 执行什么操作
  • 队列:用来存放任务

GCD的是用两个步骤

  • 定制任务 --- 确定想要做的事情
  • 将任务添加到队列中 --- GCD 会自动将队列的任务取出, 放到对应的线程中执行

任务的取出遵循队列的FIFO原则: 先进先出, 后进后出

任务的执行方式

  • 同步方式执行任务
dispatch_sync(dispatch_queue_t queue, DISPATCH_NOESCAPE dispatch_block_t block);
// queue: 队列
// block: 任务
  • 异步方式执行任务
dispatch_async(dispatch_queue_t queue, DISPATCH_NOESCAPE dispatch_block_t block);
// queue: 队列
// block: 任务
  • 同步和异步的区别
  1. 同步:只能在当前线程中执行任务, 不具备开启新线程的能力
  2. 异步:可以在新的线程中执行任务, 具备开启新线程的能力

队列的类型

并发队列 (ConCurrent Dispatch Queue)

  • 可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)
  • 并发的功能只有在异步函数(dispatch_async)下才有效

串行队列 (Serial Dispatch Queue)

  • 让任务一个接着一个的执行

队列的创建

并行队列

  • 使用_dispatch_queue_create_ 函数创建并行队列
dispatch_queue_create(const char *_Nullable label, dispatch_queue_attr_t _Nullable attr);
//  label: 表示该队列的名字(标识)
// attr: 表示队列的属性, 根据这个设置判断是并行队列还是串行队列(DISPATCH_QUEUE_CONCURRENT 表示并行队列)
  • 使用 dispatch_get_global_queue 函数获得全局的并发队列(GCD提供的)
dispatch_get_global_queue(long identifier, unsigned long flags);
// identifier: 队列的优先级(高、默认、低、后台)
// flags: 0

串行队列

  • 使用_dispatch_queue_create_ 函数创建并行队列
dispatch_queue_create(const char *_Nullable label, dispatch_queue_attr_t _Nullable attr);
//  label: 表示该队列的名字(标识)
// attr: 表示队列的属性, 根据这个设置判断是并行队列还是串行队列(DISPATCH_QUEUE_SERIAL 或NULL 表示串行行队列)
  • 使用主队列(与主线程相关联的队列)
  1. 主队列是GCD自带的一种特殊的串行队列
  2. 放置到主队列的任务, 都会在主线程中执行
  3. 使用_dispatch_get_main_queue()_ 获得主队列

© 著作权归作者所有

Japer1987
粉丝 1
博文 40
码字总数 19747
作品 0
深圳
程序员
私信 提问
Effective Objective-C Notes:GCD 实现同步锁

本文名为《GCD 实现同步锁》,内容不止于锁。文章试图通过 GCD 同步锁的问题,尽量往外延伸扩展,以讲解更多 GCD 同步机制的内容。 引语:线程安全问题 如果一段代码所在的进程中有多个线程在...

goodlook
2016/04/04
52
0
iOS OS X 和 iOS 中的多线程技术-4 (GCD)

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、GCD GCD(Grand Central Dispatch)是 Apple 公司为了提高 OS X 和 iOS 系统在多核处理器上运行并行代码的能力而开发的一系列相关技术,它...

石虎132
2017/12/03
0
0
iOS基础知识整理之多线程技术

多线程技术 多线程(multithreading) 是指软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。 原理...

无忌不悔
2018/11/07
0
0
iOS OS X 和 iOS 中的多线程技术-1

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、概念 多线程的目的是,通过并发执行提高 CPU 的使用效率,进而提供程序运行效率。 OS X 和 iOS 是多线程操作系统,它们追随 UNIX 系统使用...

石虎132
2017/11/21
0
0
iOS GCD~performSelector、dispatch_once、NSOperation总结

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、使用GCD 替代 performSelector 系列方法 NSObject 的 performSelector 系列方法有很多限制。传给要执行的方法的参数的数量是有限制的,也没...

石虎132
2017/12/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL 11.3 locking

rudi
今天
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
11
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
9
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
81
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部