第一篇:GCD多线程的概念
1.什么叫GCD?
简单来说就是:Grand Central Dispatch的简称,中文翻译就是:”牛逼的中枢调度器“
这是纯C语言,还提供了非常多强大的函数
2.GCD的相对优势:
(1)GCD是苹果公司为多核的并行运算提出的解决方案
(2)GCD会自动利用更多的cpu内核(比如:双核 等等)
(3)GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
3.注意:
(1)GCD存在于libdispatch.dylib这个库中,这个调度库包含了GCD的所有的东西,但任何IOS程序,都默认加载在这个库中,在程序运行过程中会动态的加载,不需要我们手动导入。


(2)GCD是纯C语言的,因此我们在编写GCD相关代码的时候,面对的函数,而不是方法。
(3)GCD中的函数大多数以dispatch开头。
4.GCD的任务和队列
GCD中有两个核心概念:
(1)任务:执行什么操作
(2)队列:用来存放任务
GCD的使用有两个步骤:
(1)定制任务
(2)确定想做的事情
5.要执行的任务
(1)GCD中有两个用来执行任务的函数
注意:把右边的参数(任务)提交给左边的参数(队列)进行执行
<1>如果用同步的方式的话就用:dispatch_sync(dispatch_queue,dispatch_block_t block);
说明:queue:队列
block:任务
<2>如果用异步方法执行任务的话就用:dispatch_asynch_(dispatch_queue_tqueue,dispatch_block_t block);
重点:同步和异步的区别:
同步:在当前线程中执行
异步:在另一条线程中执行
6.队列
GCD队列分为两大类型:
(1)并发队列:可以让多个任务同时执行(自动开启多个线程同时执行任务)并发功能只有在异步的dispatch_async函数下才有效

(2)串行队列:让任务一个接一个这样执行(一个任务执行完毕后,在执行下一个任务)

7.并发队列:
GCD默认已经提供了全局的并发队列,供应使用,不需要手动创建。
使用dispatch_get_global_queue函数获得全局的并发队列;
示例:
dispatch_queue_t dispatch_get_global_queue(dispatch_queue_priority_t priority,unsigned long flags)这个参数留给以后用的所以我们传个0。
第一个参数为优先级,在这里是默认的。获取一个全局的默认优先级的并发队列。

dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAUI,0)这样就可以获取全局并发队列了
说明:全局并发队列的优先级
#define DISPATCH_QUEUE_PRIORITY_HIGH 2//高
#define DISPATCH_QUEUE_PRIORITY_DEFAULT//默认(中)
#define DISPATCH_QUEUE_PRIORITY_LOW//低
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN//后天
8.串行队列
GCD串行有两种途径:
(1)使用dispatch_queue_create函数创建串行队列
dispatch_queue_t dispatch_queue_create(const char *label,dispatch_queue_attr_t attr);//队列名称,队列属性,一般用NULL即可
示例:
创建: dispatch_queue_t queue = dispatch_queue_create("wendingding",NULL);
非ARC需要释放手动创建的队列:dispatch_release(queue);
(2)使用主队列(跟主线程有关系的队列)
主队列是GCD自带的一种特殊的串行队列,放在主队列中的任务,都会放到主线程中执行。
使用dispatch_get_main_queue()获得主队列
示例:
dispatch_queue_t queue = dispatch_get_main_queue();
9.说明:
同步、异步、并发、串行这四个术语是比较混淆的,所以好好注意哦!
同步和异步决定了是否开启多一条线程:
同步:在当前线程执行任务,不具备开启新线程的能力
异步:在新的线程执行任务,就具备了开启新线程的能力
并发和串行决定了任务的执行方式:
并发:多个任务执行同时进行
串行:一个执行完毕后再接着一个执行
提示:将任务添加到队列中,GCD会自动将队列中的任务取出来,放到对应的线程中并执行。当任务取出后遵循的队列FIFO原则:先进先出,后进后出。
无论什么队列和什么任务,线程的创建和回收不需要程序员参与,由队列来负责,程序员只需要面对队列和任务。
GCD在后端管理这一个线程池,GCD不仅决定着Block代码块将在哪个线程中被执行,
而且还可以根据可用的系统资源对这些线程进行管理,从而让开发者从线程管理的工作中解放出来,
通过GCD这种集中的管理线程,缓解了大量的线程被创建的问题。
10.一些队列的执行效果

第一篇:GCD多线程的概念的更多相关文章
- Flink入门-第一篇:Flink基础概念以及竞品对比
Flink入门-第一篇:Flink基础概念以及竞品对比 Flink介绍 截止2021年10月Flink最新的稳定版本已经发展到1.14.0 Flink起源于一个名为Stratosphere的研究项目主 ...
- 第一篇:NSOperation的概念
一.说明 NSOperation的作口:配合使用NSOperation和NSOperationQueue也能实现多线程 NSOperation和NSOperationQueue实现多线程的具体步骤: ...
- iOS开发多线程篇—GCD介绍
iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...
- iOS开发多线程篇—GCD简介
iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...
- iOS 开发多线程篇—GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- iOS开发多线程篇—GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- 秒杀多线程第一篇 多线程笔试面试题汇总 ZZ 【多线程】
http://blog.csdn.net/morewindows/article/details/7392749 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些 ...
- iOS开发多线程篇—GCD的基本使用
iOS开发多线程篇—GCD的基本使用 一.主队列介绍 主队列:是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放到主线程中执行. 提示:如果把任务放到主队列中进 ...
- AntDesign-React与VUE有点不一样,第一篇深入了解React的概念之一:JSX
AntDesign-React与VUE有点不一样,第一篇深入了解React的概念之一:JSX 一.什么是JSX 使用JSX声明一个变量(REACT当中的元素): const element =< ...
随机推荐
- bzoj 1066 : [SCOI2007]蜥蜴 网络流
题目链接 给一个n*m的图, 里面每一个点代表一个石柱, 石柱有一个高度. 初始时有些石柱上面有蜥蜴, 蜥蜴可以跳到距离他曼哈顿距离小于等于d的任意一个石柱上,跳完后, 他原来所在的石柱高度会减一, ...
- IOS 特定于设备的开发:监测Retina支持
近年来,Apple在其旗舰设备上引入了Retina显示屏.根据Apple的说法,他的像素密度非常高,足以使人眼无法区分单独的像素. UIScreen类提供了一种容易的方式,用于监查当前设备是否提供了内 ...
- pyqt开发教程-搭建环境和开发示例
搭建环境和开发示例 * 安装 安装包 要对应python的版本 32位安装包(我PC上) http://jaist.dl.sourceforge.net/project/pyqt/PyQt4/PyQt ...
- 自定义TWebBrowser浏览器控制遇到的一些问题
最近工作需要,要将TWebBrowser样式改头换面,包括菜单,滚动条等,都要换掉. 由于滚动条已经屏蔽掉,所以关于页面滚动等,全部都需要自己写代码来模拟了.模拟的过程中发现获得页面的客户区大小Cli ...
- chrome extensions
chrome web store AppsGamesExtensionsThemes CATEGORIES All FEATURESClear Runs Offline By ...
- HDU 2588 GCD
题目大意:给定N,M, 求1<=X<=N 且gcd(X,N)>=M的个数. 题解:首先,我们求出数字N的约数,保存在约数表中,然后,对于大于等于M的约数p[i],求出Euler(n/ ...
- nmon related
nmon related pGraph (supports nmon) https://www.ibm.com/developerworks/community/wikis/home?lang=en# ...
- C++ 标准模板库(STL)
C++ 标准模板库(STL)C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), ...
- JS学习之事件冒泡
(1)什么是事件起泡 首先你要明白一点,当一个事件发生的时候,该事件总是有一个事件源,即引发这个事件的对象,一个事件不能凭空产生,这就是事件的发生. 当事件发生后,这个事件就要开始传播.为什 ...
- Hibernate学习之延迟加载
转自:http://www.cnblogs.com/xiaoluo501395377/p/3371776.html 在hibernate中我们知道如果要从数据库中得到一个对象,通常有两种方式,一种是通 ...