• 多线程04CGD基础

    • 一CGD简介
    • 1 什么是GCD
    • 2 GCD的优势
    • 二任务和队列
      • 1 GCD中有2个核心概念
      • 2 GCD的使用就2个步骤
    • 三执行任务
      • 1 执行任务的方法
      • 2 同步和异步的区别
      • 3 队列的类型
      • 4 同步异步并发串行
    • 四创建队列
      • 1 并发队列

        • 11 使用dispatch_queue_create函数创建队列
        • 12 队列的类型说明
        • 13 创建并发队列
        • 14 全局并发队列
        • 15 全局并发队列的优先级
        • 16 获得全局并发队列
      • 2 串行队列
        • 21 使用dispatch_queue_create函数创建串行队列
        • 22 使用主队列
    • 五各种队列的执行效果

多线程04——CGD基础

一、CGD简介

1.1 什么是GCD

全称是Grand Central Dispatch

纯C语言,提供了非常多强大的函数

1.2 GCD的优势

GCD是苹果公司为多核的并行运算提出的解决方案

GCD会自动利用更多的CPU内核(比如双核、四核)

GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)

程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码


二、任务和队列

2.1 GCD中有2个核心概念

任务:执行什么操作

队列:用来存放任务

2.2 GCD的使用就2个步骤

定制任务

确定想做的事情

将任务添加到队列中

GCD会自动将队列中的任务取出,放到对应的线程中执行

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


三、执行任务

3.1 执行任务的方法

GCD中有2个用来执行任务的常用函数

用同步的方式执行任务

//queue:队列
//block:任务
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

用异步的方式执行任务

dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

GCD中还有个用来执行任务的函数:

//这个queue不能是全局的并发队列
dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);

在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行

3.2 同步和异步的区别

同步:只能在当前线程中执行任务,不具备开启新线程的能力

异步:可以在新的线程中执行任务,具备开启新线程的能力

3.3 队列的类型

GCD的队列可以分为2大类型

并发队列(Concurrent Dispatch Queue)

可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)

并发功能只有在异步(dispatch_async)函数下才有效

串行队列(Serial Dispatch Queue)

让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)

3.4 同步、异步、并发、串行

同步和异步主要影响:能不能开启新的线程

同步:只是在当前线程中执行任务,不具备开启新线程的能力

异步:可以在新的线程中执行任务,具备开启新线程的能力

并发和串行主要影响:任务的执行方式

并发:允许多个任务并发(同时)执行

串行:一个任务执行完毕后,再执行下一个任务


四、创建队列

4.1 并发队列

4.1.1 使用dispatch_queue_create函数创建队列

dispatch_queue_t
dispatch_queue_create(const char *_Nullable label, // 队列名称 dispatch_queue_attr_t _Nullable attr);// 队列的类型

4.1.2 队列的类型说明

DISPATCH_QUEUE_CONCURRENT //并发DISPATCH_QUEUE_SERIAL //串行

4.1.3 创建并发队列

//第一个参数:c语言的字符串,标签
//第二个参数:队列的类型
// DISPATCH_QUEUE_CONCURRENT 并发
// DISPATCH_QUEUE_SERIAL 串行
dispatch_queue_t queue = dispatch_queue_create("com.wiming",DISPATCH_QUEUE_CONCURRENT);

4.1.4 全局并发队列

GCD默认已经提供了全局的并发队列,供整个应用使用,可以无需手动创建

使用dispatch_get_global_queue函数获得全局的并发队列

dispatch_queue_t
dispatch_get_global_queue(
dispatch_queue_priority_t priority, // 队列的优先级
unsigned long flags); // 此参数暂时无用,用0即可

4.1.5 全局并发队列的优先级

#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 // 后台

4.1.6 获得全局并发队列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

或者

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

4.2 串行队列

GCD中获得串行有2种途径

4.2.1 使用dispatch_queue_create函数创建串行队列

// 创建串行队列(队列类型传递NULL或者DISPATCH_QUEUE_SERIAL)
dispatch_queue_t queue = dispatch_queue_create("com.wiming", NULL);

4.2.2 使用主队列

主队列是GCD自带的一种特殊的串行队列

放在主队列中的任务,都会放到主线程中执行

使用 dispatch_get_main_queue() 获得主队列

dispatch_queue_t queue = dispatch_get_main_queue();

五、各种队列的执行效果

使用sync函数往当前串行队列中添加任务,会卡住当前的串行队列

iOS学习笔记-105.多线程04——CGD基础相关推荐

  1. iOS学习笔记-110.多线程09——CGD队列组

    多线程09CGD队列组 一需求说明 二通知使用 dispatch_group_notify 1 队列组的使用可以分为四个步骤 2 示例代码 2 结果 三通知使用 dispatch_group_wait ...

  2. iOS学习笔记-109.多线程08——CGD快速迭代

    多线程08CGD快速迭代 一说明 二for迭代 三GCD的快速迭代 四使用for迭代移动文件示例 1 说明 2 示例代码 3 图示与结果 五使用for迭代移动文件示例 1 示例代码 2 图示与结果 多 ...

  3. iOS学习笔记-108.多线程07——CGD栅栏函数、延时、一次性代码

    多线程07CGD栅栏函数延时一次性代码 一说明 1 栅栏函数说明 2 延时执行 3 一次性代码 二栅栏函数 1 说明 2 代码 3 结果 4 结果分析 三延时执行 1 调用NSObject的方法 2 ...

  4. iOS学习笔记-106.多线程05——CGD同步、异步函数和并行、串行、主队列示例

    多线程05CGD同步异步函数和并行串行主队列示例 一说明与图示 二异步函数 并发队列 1 代码 2 结果 三异步函数 串行队列 1 代码示例 2 结果 四同步函数 并发队列 1 代码示例 2 结果 五 ...

  5. iOS学习笔记11 多线程入门

    ###一.iOS多线程 ######iOS多线程开发有三种方式: NSThread NSOperation GCD iOS在每个进程启动后都会创建一个主线程,更新UI要在主线程上,所以也称为UI线程, ...

  6. IOS学习笔记(五)——UI基础UIWindow、UIView

    在PC中,应用程序多是使用视窗的形式显示内容,手机应用也不例外,手机应用中要在屏幕上显示内容首先要创建一个窗口承载内容,iOS应用中使用UIWindow.UIView来实现内容显示. UIWindow ...

  7. Java学习笔记(7)——Java基础之IO多线程网络思维导图

    Java面向对象学习笔记之:包括IO(字节流,字符流,节点流,处理流).线程(线程创建,线程控制,线程同步).网络(TCP Scoket,  UDP Scoket)(全屏观看Java学习笔记(7)-- ...

  8. iOS学习笔记-自己动手写RESideMenu

    代码地址如下: http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars ...

  9. IOS学习笔记03---C语言概述

    IOS学习笔记03---C语言概述 0 3.C语言1-C语言概述         qq交流群:创梦技术交流群:251572072                        创梦网络赚钱群:2483 ...

最新文章

  1. KVM之EPT与影子页表(七)
  2. 学知识的时候出去看看的意义
  3. 网络虚拟化有几种实现方式_停车场管理系统的防砸车功能有几种方式?如何实现?...
  4. 小米开招.NET,20~40k*16薪,点名要求WPF+自动化!
  5. java实现从键盘上输入学生考试的科目和学生的每科分数,输出总分、最高分、最低分、平均分
  6. Git—如何Windows操作系统中安装Git
  7. 中国唯一入选 Forrester 领导者象限,阿里云 Serverless 产品能力全球第一
  8. 图片云存储以及图片外链
  9. 下厨房某词条下的所有图片爬取
  10. 天创速盈:拼多多推广效果不好,哪里需要改善?
  11. 如何从零开始学习SEM?
  12. 【服务器】本地运行成功,但服务器上运行却显示错误500
  13. 华为鸿蒙系统基于安卓系统方面有哪些提升
  14. Python发送多附件邮件的方法
  15. 关于解决克隆Windows Xp sp2系统安装IIS5.1的方法
  16. Photoshop打造唯美的蓝色古装外景人物图片
  17. OpenGL---GLUT教程(四) GLUT动画
  18. 子网掩码!如何划分子网掩码,计算IP地址
  19. 项目感受|总结|献给怀揣着梦想来到兄弟连学习的兄弟姐妹们
  20. 机器学习(一)——什么是机器学习

热门文章

  1. DLAP221上Yolov5s性能测试
  2. 【LeetCode - 742】二叉树最近的叶节点
  3. 机器学习之AUC、AUPRC、F1等评价指标的含义
  4. 入门JAVA第六天 面向对象
  5. 第1篇、Linux操作基础|Shell基础命令
  6. matlab fft(x dim),matlab的fft函数
  7. gogoprotobuf在windows上遇见的坑
  8. 如何从0开始开发一个实时联机游戏
  9. 【JAVA 猴子摘桃数学游戏】
  10. 清华博士段安:隐私计算如何打破数据孤岛 实现数据价值最大化 l 华坤道威专访