当前位置: 首页 > article >正文

小心串行队列的执行依赖

小心串行队列的执行依赖

Serial Queue

概念

什么是串行

任务串行,意味着在同一时间,有且只有一个任务被执行,即一个任务执行完毕之后再执行下一个任务。

请听题

下面的 Objective-C 代码执行结果是?

    dispatch_queue_t serialQueue = dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL);
    NSLog(@"1");
    dispatch_async(serialQueue, ^{
       NSLog(@"2");
    });
    NSLog(@"3");
    dispatch_sync(serialQueue, ^{
      NSLog(@"4");
    });
    NSLog(@"5");

分析

运行结果如下

1
3
2
4
5
  • 首先先打印 1
  • 接下来将任务 2 添加至串行队列中,由于任务 2 是异步执行的(会开新的线程),不会阻塞当前线程,所以继续向下执行,打印 3
  • 然后是任务 4,将任务 4 添加至串行队列上,因为任务 4 和任务 2 在同一串行队列,故任务 4必须等任务2执行完后才能执行,又因为任务4是同步任务,会阻塞当前线程,只有执行完任务4才能继续向下执行打印5`
    所以最终顺序就是 13245
  • 这里的任务 4 在主线程中执行,而任务2 在子线程中执行, 可以添加线程相关信息, 如下
    dispatch_queue_t serialQueue = dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL);
    NSLog(@"1, at %@", [NSThread currentThread]);
    dispatch_async(serialQueue, ^{
       NSLog(@"2, at %@", [NSThread currentThread]);
    });
    NSLog(@"3, at %@", [NSThread currentThread]);
    dispatch_sync(serialQueue, ^{
      NSLog(@"4, at %@", [NSThread currentThread]);
    });
    NSLog(@"5, at %@", [NSThread currentThread]);

运行结果如下

1, at <_NSMainThread: 0x600001710000>{number = 1, name = main}
3, at <_NSMainThread: 0x600001710000>{number = 1, name = main}
2, at <NSThread: 0x600001758200>{number = 7, name = (null)}
4, at <_NSMainThread: 0x600001710000>{number = 1, name = main}
5, at <_NSMainThread: 0x600001710000>{number = 1, name = main}

如果是并发线程呢 ?

    dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"1, at %@", [NSThread currentThread]);
    dispatch_async(queue, ^{
       NSLog(@"2, at %@", [NSThread currentThread]);
    });
    NSLog(@"3, at %@", [NSThread currentThread]);
    dispatch_sync(queue, ^{
      NSLog(@"4, at %@", [NSThread currentThread]);
    });
    NSLog(@"5, at %@", [NSThread currentThread]);

因为是并发线程, 所以任务 2 和任务 4 执行先后的依赖关系, 运行结果有如下3种可能

结果一
1, at <_NSMainThread: 0x600001700100>{number = 1, name = main}
3, at <_NSMainThread: 0x600001700100>{number = 1, name = main}
4, at <_NSMainThread: 0x600001700100>{number = 1, name = main}
2, at <NSThread: 0x600001705700>{number = 5, name = (null)}
5, at <_NSMainThread: 0x600001700100>{number = 1, name = main}
结果二
1, at <_NSMainThread: 0x600001704680>{number = 1, name = main}
3, at <_NSMainThread: 0x600001704680>{number = 1, name = main}
2, at <NSThread: 0x60000174d080>{number = 5, name = (null)}
4, at <_NSMainThread: 0x600001704680>{number = 1, name = main}
5, at <_NSMainThread: 0x600001704680>{number = 1, name = main}
结果三, 复现概率最低

在这里插入图片描述


http://www.kler.cn/a/272239.html

相关文章:

  • BEVFusion论文阅读
  • 【Python】循环语句
  • 小白爬虫——selenium入门超详细教程
  • AI 编程工具—Cursor AI 对话模式详解 内嵌对话模式
  • 美区TikTok解封后如何回归使用?
  • springboot音乐播放器系统
  • Vue2 引入使用ElementUI详解
  • python --阿里云(智能媒体管理/视频点播)
  • CI/CD实战-gitlab代码仓库 2
  • Git入门学习
  • 最后的挣扎 - Qt For Android on HuaWei Mate 60Pro (v4.0.0)
  • 【AI】Ubuntu系统深度学习框架的神经网络图绘制
  • Etcd 介绍与使用(入门篇)
  • shallowReactive浅层式响应对象
  • wireshark解析https数据包
  • 每周一算法:双向深搜
  • Sqlserver 模糊查询中文及在mybatis xml【非中文不匹配查询】N@P2问题
  • 在Ubuntu系统中使用Systemctl添加启动项的详细指南
  • sqlite 常见命令 表结构
  • go rabbitmq 操作
  • 体系结构安全第二次作业:调研整理编译器优化引入的安全问题,形成调研报告提交
  • Docker学习之数据管理(超详解析)
  • 鸿蒙内核系统
  • IDEA : 已经有一个永久破解版的IDEA2019版本,现在又想安装最新版本的,俩版本共存,发现新版本打不开的解决方案
  • html5cssjs代码 022 表单输入类型示例
  • 高等代数复习:应试经验:求行列式