DispatchQueue.global()默认QoS存疑:为何显示unspecified且触发优先级反转警告?
关于DispatchQueue.global()的QoS疑问与优先级反转警告问题
问题背景
示例代码
let queue = DispatchQueue.global() queue.async { let group = DispatchGroup() group.enter() DispatchQueue.global().asyncAfter(deadline: DispatchTime.now(), qos: .default) { //do sth in default queue group.leave() } group.wait() DispatchQueue.main.async { [weak self] in //do sth in main queue } }
触发的线程性能警告
Thread running at QOS_CLASS_USER_INITIATED waiting on a lower QoS thread running at QOS_CLASS_DEFAULT. Investigate ways to avoid priority inversions
调试输出结果
(lldb) print queue.qos (Dispatch.DispatchQoS) $R0 = { qosClass = unspecified //I think this should be default. relativePriority = 0 }
核心疑问
- 苹果官方文档说明
DispatchQueue.global()的默认参数为.qos: .default,但调试打印外部队列的QoS却显示unspecified,是否文档存在错误? - 为什么会出现上述优先级反转警告?
解答
1. 苹果文档不存在错误
DispatchQueue.global()的默认QoS确实是.default,但直接打印队列的qos属性显示unspecified是因为全局队列的QoS是动态的,会继承任务提交时的上下文优先级。当你仅创建全局队列但未在其中执行任务时,队列本身的qos属性会返回unspecified;而实际执行任务时,任务的QoS会根据提交时的上下文确定——如果没有上下文可继承,就会使用默认的.default。
2. 优先级反转警告的原因
- 外部
queue.async提交的任务,实际执行时的QoS可能被提升到了.userInitiated(比如当前提交任务的上下文是UI事件等用户触发的操作,系统会自动提升优先级)。 - 内部的
asyncAfter任务明确指定了.default的QoS,优先级低于.userInitiated。 - 外部任务调用
group.wait()阻塞了高优先级的.userInitiated线程,等待低优先级的.default任务完成,这就形成了优先级反转——高优先级线程被低优先级任务阻塞,可能导致高优先级任务延迟,因此系统触发警告。
修复建议
- 优先使用
notify替代wait:避免阻塞线程,从根源上消除优先级反转的可能:
let queue = DispatchQueue.global() queue.async { let group = DispatchGroup() group.enter() DispatchQueue.global(qos: .default).asyncAfter(deadline: .now()) { // do sth in default queue group.leave() } // 用notify在任务完成后切换到主线程,无需阻塞等待 group.notify(queue: .main) { [weak self] in // do sth in main queue } }
- 确保内部任务QoS不低于外部任务:如果必须使用
wait,可以让内部任务继承外部任务的QoS,或者明确设置相同/更高的优先级:
let queue = DispatchQueue.global() queue.async { let group = DispatchGroup() group.enter() // 继承当前任务的QoS DispatchQueue.global(qos: DispatchQueue.currentQoS.qosClass).asyncAfter(deadline: .now()) { // do sth group.leave() } group.wait() DispatchQueue.main.async { [weak self] in // do sth in main queue } }
内容的提问来源于stack exchange,提问作者frank
相关产品推荐
相关产品推荐

