串行:类似买东西只排了一个队伍,按顺序执行,不分同步异步,先进先出

串行+纯同步:

    //创建串行队列,并设置队列名static const char* queName = "name";dispatch_queue_t que = dispatch_queue_create(queName, DISPATCH_QUEUE_SERIAL);dispatch_queue_set_specific(que, queName, &queName, nil);if (dispatch_get_specific(queName)) {NSLog(@"1111");}else{dispatch_sync(que, ^{sleep(2);NSLog(@"222222");});}if (dispatch_get_specific(queName)) {NSLog(@"3333");}else{dispatch_sync(que, ^{sleep(2);NSLog(@"44444");});}if (dispatch_get_specific(queName)) {NSLog(@"55555");}else{dispatch_sync(que, ^{sleep(2);NSLog(@"666666");});}NSLog(@"777777");

立即阻塞当前线程,执行队列任务,等待全部任务完成后返回原线程。

运行结果如下:

2022-06-16 16:46:51.081025+0800 test[1409:577908] 222222

2022-06-16 16:46:53.082349+0800 test[1409:577908] 44444

2022-06-16 16:46:55.083660+0800 test[1409:577908] 666666

2022-06-16 16:46:55.083903+0800 test[1409:577908] 777777

同步+纯异步:

    //创建串行队列,并设置队列名static const char* queName = "name";dispatch_queue_t que = dispatch_queue_create(queName, DISPATCH_QUEUE_SERIAL);dispatch_queue_set_specific(que, queName, &queName, nil);if (dispatch_get_specific(queName)) {NSLog(@"1111");}else{dispatch_async(que, ^{sleep(2);NSLog(@"222222");});}if (dispatch_get_specific(queName)) {NSLog(@"3333");}else{dispatch_async(que, ^{sleep(2);NSLog(@"44444");});}if (dispatch_get_specific(queName)) {NSLog(@"55555");}else{dispatch_async(que, ^{sleep(2);NSLog(@"666666");});}NSLog(@"777777");

不阻塞当前线程。开辟一个新的线程顺序执行队列任务

运行结果如下:

2022-06-16 16:52:37.516960+0800 test[1412:579327] 777777

2022-06-16 16:52:39.522169+0800 test[1412:579341] 222222

2022-06-16 16:52:41.525529+0800 test[1412:579341] 44444

2022-06-16 16:52:43.530921+0800 test[1412:579341] 666666

同步+异步同步混合:

//创建串行队列,并设置队列名static const char* queName = "name";dispatch_queue_t que = dispatch_queue_create(queName, DISPATCH_QUEUE_SERIAL);dispatch_queue_set_specific(que, queName, &queName, nil);if (dispatch_get_specific(queName)) {NSLog(@"1111");}else{dispatch_async(que, ^{sleep(2);NSLog(@"222222");});}if (dispatch_get_specific(queName)) {NSLog(@"3333");}else{dispatch_sync(que, ^{sleep(2);NSLog(@"44444");});}if (dispatch_get_specific(queName)) {NSLog(@"55555");}else{dispatch_async(que, ^{sleep(2);NSLog(@"666666");});}if (dispatch_get_specific(queName)) {NSLog(@"8888");}else{dispatch_sync(que, ^{sleep(2);NSLog(@"99999");});}if (dispatch_get_specific(queName)) {NSLog(@"aaaaaa");}else{dispatch_async(que, ^{sleep(2);NSLog(@"bbbbbbb");});}NSLog(@"777777");

立即阻塞当前任务,当队列中最后一个同步执行结束后,立即返回当前任务(即使后面还有异步任务需要执行也会返回),队列中的任务一定是按顺序运行的,不区分同步异步

运行结果如下:

2022-06-16 16:57:05.541766+0800 test[1421:581767] 222222

2022-06-16 16:57:07.543157+0800 test[1421:581748] 44444

2022-06-16 16:57:09.544609+0800 test[1421:581767] 666666

2022-06-16 16:57:11.545975+0800 test[1421:581748] 99999

2022-06-16 16:57:11.546284+0800 test[1421:581748] 777777

2022-06-16 16:57:13.551024+0800 test[1421:581767] bbbbbbb

并行:先进先出。类似买东西排队,一个队伍,但最前面的顾客如果是异步的,则立即换一个新地方买(开辟新线程),后续顾客立即向前移动一个。同步的顾客则停在当前队伍购买,后面的顾客需要等待该顾客完成(即使后面有异步顾客,异步顾客也得等该同步顾客完成才能运行)。

并行+纯同步:

    //创建串行队列,并设置队列名static const char* queName = "name";dispatch_queue_t que = dispatch_queue_create(queName, DISPATCH_QUEUE_CONCURRENT);dispatch_queue_set_specific(que, queName, &queName, nil);if (dispatch_get_specific(queName)) {NSLog(@"1111");}else{dispatch_sync(que, ^{sleep(2);NSLog(@"222222");});}if (dispatch_get_specific(queName)) {NSLog(@"3333");}else{dispatch_sync(que, ^{sleep(2);NSLog(@"44444");});}if (dispatch_get_specific(queName)) {NSLog(@"55555");}else{dispatch_sync(que, ^{sleep(2);NSLog(@"666666");});}NSLog(@"777777");

立即阻塞当前任务,执行队列任务,队列任务完成后返回当前任务

执行结果:

2022-06-16 17:03:37.613182+0800 test[1427:583818] 222222

2022-06-16 17:03:39.614572+0800 test[1427:583818] 44444

2022-06-16 17:03:41.615903+0800 test[1427:583818] 666666

2022-06-16 17:03:41.616188+0800 test[1427:583818] 777777

并行+纯异步:

 //创建串行队列,并设置队列名static const char* queName = "name";dispatch_queue_t que = dispatch_queue_create(queName, DISPATCH_QUEUE_CONCURRENT);dispatch_queue_set_specific(que, queName, &queName, nil);if (dispatch_get_specific(queName)) {NSLog(@"1111");}else{dispatch_async(que, ^{sleep(2);NSLog(@"222222");});}if (dispatch_get_specific(queName)) {NSLog(@"3333");}else{dispatch_async(que, ^{sleep(2);NSLog(@"44444");});}if (dispatch_get_specific(queName)) {NSLog(@"55555");}else{dispatch_async(que, ^{sleep(2);NSLog(@"666666");});}NSLog(@"777777");

不影响当前任务,有多少个异步就开辟多少线程。线程完成顺序未知。

运行结果:

2022-06-16 17:09:02.320619+0800 test[1432:585400] 777777

2022-06-16 17:09:04.322568+0800 test[1432:585412] 222222

2022-06-16 17:09:04.325889+0800 test[1432:585414] 44444

2022-06-16 17:09:04.325892+0800 test[1432:585413] 666666

并行+同步异步混合:

    //创建串行队列,并设置队列名static const char* queName = "name";dispatch_queue_t que = dispatch_queue_create(queName, DISPATCH_QUEUE_CONCURRENT);dispatch_queue_set_specific(que, queName, &queName, nil);if (dispatch_get_specific(queName)) {NSLog(@"1111");}else{dispatch_async(que, ^{sleep(2);NSLog(@"222222");});}if (dispatch_get_specific(queName)) {NSLog(@"3333");}else{dispatch_sync(que, ^{sleep(2);NSLog(@"44444");});}if (dispatch_get_specific(queName)) {NSLog(@"55555");}else{dispatch_async(que, ^{sleep(2);NSLog(@"666666");});}if (dispatch_get_specific(queName)) {NSLog(@"88888");}else{dispatch_sync(que, ^{sleep(2);NSLog(@"999999");});}if (dispatch_get_specific(queName)) {NSLog(@"aaaaa");}else{dispatch_async(que, ^{sleep(2);NSLog(@"bbbbbb");});}NSLog(@"777777");

立即阻塞当前任务,队列最前方如果是异步,则开辟新线程,异步立即出队列(即使异步任务没完成)。如果最前方是同步队列,则同步任务完成后出队列,后续任务都需要等待(无论同步异步),同步任务一定是按入栈顺序运行,异步任务完成则是未知的。最后一个同步任务完成后立即返回当前任务(即使还有异步)。

运行结果如下:

2022-06-16 17:26:16.375671+0800 test[1450:591469] 44444

2022-06-16 17:26:16.379838+0800 test[1450:591482] 222222

2022-06-16 17:26:18.377038+0800 test[1450:591469] 999999

2022-06-16 17:26:18.377093+0800 test[1450:591480] 666666

2022-06-16 17:26:18.377342+0800 test[1450:591469] 777777

2022-06-16 17:26:20.379147+0800 test[1450:591480] bbbbbb

OC下的串行、并行和同步、异步的组合相关推荐

  1. 异步串行通讯和同步串行通讯对比

    异步串行通讯和同步串行通讯对比 作者:刘洪涛,华清远见嵌入式学院高级讲师,ARM ATC授权培训讲师. 在计算机系统中,CPU和外部通信有两种通信方式:并行通信和串行通信.而按照串行数据的时钟控制方式 ...

  2. 串行同步通信“时钟同步”怎么理解?

    问题:在串行同步通信中,发送端需要和接受端进行同步,时钟同步.这个时钟同步是什么概念?书上说是用同步码从发送端发出去,接受端接收同步码就可以同步了.这个同步怎么可能是时钟上的同步呢?比如发送端是0时刻 ...

  3. ChibiOS系列:五、将STM32 USART与ChibiOS串行驱动程序配合使用

    本文翻译自:http://www.playembedded.org/blog/stm32-usart-chibios-serial/ 将STM32 USART与ChibiOS串行驱动程序配合使用 发表 ...

  4. SPI、UART、I2C三种串行总线简介

    是一种 高速.全双工.同步.串行通信总线,3~4线接口,以主从模式工作,收发独立,可以实现多个SPI设备互相连接. 提供SPI串行时钟的SPI设备为SPI主机或主设备(Master),其他设备为SPI ...

  5. 基于51的串行通讯原理及协议详解(uart)

    串行与并行通讯方式 并行:控制简单,传输速度快.线多,长距离成本较高且同时接受困难. 串行:将数据字节分成一位一位的行驶在一条传输线上进行传输.如图: 同步与异步串行通讯方式 同步串行通讯方式:同步通 ...

  6. ADI官方解释在SPI通信期间,数据的发送(串行移出到MOSI/SDO总线上)和接收(采样或读入总线(MISO/SDI)上的数据)

    串行外设接口(SPI)是微控制器和外围IC(如传感器.ADC.DAC.移位寄存器.SRAM等)之间使用最广泛的接口之一.本文先简要说明SPI接口,然后介绍ADI公司支持SPI的模拟开关与多路转换器,以 ...

  7. max232c语言,串行口通信(STC89C52+MAX232):串行口通信硬件设计详解

    一. STC89C52与MAX232连接原理图 二. 串行口通信原理 1. 基本通信方式 a. 并行通信 定义: 将数据字节的各位用多条数据线同时进行传送, 每一位数据都需要一条传输线, 还需要一条信 ...

  8. Cyprss串行铁电存储器64Kbit FM25CL64B-GTR

    FM25CL64B-GTR是串行FRAM存储器.存储器阵列在逻辑上组织为8,192×8位,可使用行业标准的串行外围设备接口(SPI)总线进行访问.FRAM的功能操作类似于串行闪存和串行EEPROM.F ...

  9. FPGA之道(29)VHDL的串行语句

    文章目录 前言 VHDL的串行语句 VHDL直接信号赋值语句 VHDL变量赋值语句 VHDL条件语句 优先级条件语句 无优先级条件语句 优先级条件语句与无优先级条件语句的对比 case-when的一些 ...

最新文章

  1. word2vec (一) 简介与训练过程概要
  2. Binder实用指南(二) - 实战篇
  3. 数据结构(一)线性表链式存储实现
  4. python difflib 源码_python difflib 模块
  5. 在el-table中使用el-popover,没法点击确定或取消来关闭添加 多个按钮
  6. Mac OS X上安装 Ruby运行环境
  7. html5总结2000字,建筑识图实训总结2000字6篇范文
  8. Extjs中EditorGridPanel修改并获取数据的两种方式
  9. 模拟退火算法求解超市布局问题
  10. 自己用C#写的控制三菱FX5U PLC
  11. 【网络技术联盟站】瑞哥教你如何使用 Console 接口管理设备
  12. 机器学习(十一):新闻摘要提取小案例
  13. 剑指Offer 27—二叉树的镜像
  14. 互联网业务实战(一)--今日头条文章发布实现
  15. 网页在线 运行 html 代码
  16. 三维激光测距之三角法测距
  17. Oracle期末复习1
  18. 使用CUPS打印服务
  19. WebRTC开源项目-手把手教你搭建AppRTC
  20. bilibili 网页版如何下载视频到本地(不用下载工具)

热门文章

  1. 90-新垃圾回收机制说明
  2. osx android png图片自动 边,照片图像无损放大,这6款MacOS神器你也许需要
  3. python读取cad表格_使用Python读取AutoCAD DXF文档
  4. 基于可编程超表面的雷达通信一体化系统
  5. PS工具栏之【选择工具栏和编辑工具栏】矩形和椭圆的使用技巧
  6. 故障转移群集(MSCS)搭建部署-图文详解
  7. 产品卖点和目标人群如何匹配
  8. Linux Ubuntu 16.04 安装 yaml-cpp ROS 下参数服务器及yaml-cpp实现参数读写
  9. oracle 级联删除触发器,sql触发器级联删除
  10. iOS获取手机唯一标识符来判断不同终端登录(IDFA和UUID分析)