| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> dispatch_queue_set_specific给队列设置特有数据 -> 正文阅读 |
|
[移动开发]dispatch_queue_set_specific给队列设置特有数据 |
想要让某个任务在指定队列中以同步的方式执行完后, 继续执行其他任务. 这样说有点抽象, 举个具体的例子, 在队列A中执行任务1, 任务1完成后到串行队列B中执行任务2, 任务2完成后再回到队列A执行后续的任务3,4,... 看起来很简单, 很快写下了这样的代码
测试完美.? 随着需求的迭代, 产生了新的场景, 此场景需要在queueB下安排queueA下做些事情, 然后就发生了死锁. 代码是这样的
结果就是必定会出现死锁, 出现queueB -> queueA -> queueB, 那就判断下当前队列是不是queueB, 如果是queueB, 直接执行任务;不是的话, 回到queueB中执行任务 一顿操作后, 发现在gcd中, 系统提供出了一个方法, dispatch_get_current_queue(), 可以获取当前的队列, 但是这个方法又被标记为不推荐使用, 先不管, 试试再说 使用dispatch_get_current_queue() == queueB?判断是不是在queueB中, 看起来很正常, 运行看看,
结果还是必定会出现死锁,?在queueA使用dispatch_get_current_queue()获取到的是queueA, 但是实际上这个任务还是在queueB的block中执行的,?queueB是一个串行队列, 需要等待前一个任务完成才能执行后面的Block, Block又要求同步执行新的任务, 所以发生了死锁. 上面的现象和在下面是同样的原因, 只不过多了一次queueA的嵌套, 在串行队列中,使用同步方法添加新的任务, 旧的任务永远执行不完, 新的任务永远无法开始.
一个队列不一定对应一个线程, ?我们在代码中可以创建成千上万个队列, 但是系统能创建出的线程不是无限的, 系统使用全局并发队列维护了一个线程池, 我们创建的所有的队列最终都会已dispatch_set_target_queue的方式关联到某个全局并发队列中. 也就是说虽然指定了在队列B中的执行任务, 但是队列不代表线程, 队列B可能和队列A使用的是同一个全局队列中的一个串行队列, 此时就会发生串行队列相互等待造成的线程死锁.? 更多目标队列的知识:?GCD知识补充.目标队列+GCD循环 下面的2个串行队列,?queueA和queueB都关联到了同一个target队列上, 官方推荐使用dispatch_queue_set_specific来获取当前线程的信息,??先看看这个例子
dispatch_get_specific 会从当前线程开始找,
但是我们的需求要求queueA和queueB是各自独立的队列, 根本没有调用过dispatch_set_target_queue, 在queueA中获取queueB的key获取到的是NULL, 所以还是不能满足要求. 最后只能使用不那么优雅的方式解决了.?
虽然不那么优雅, 但是还是需求要紧, 而且还了解到了dispatch_get_current_queue的特性,?dispatch_get_specific没有想象的那么好用, 也算是补充了自己的盲区. 最后, 在不改变结构的情况下, 有没有更好的方法可以做到不死锁的.
|
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 21:00:46- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |