You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于DispatchQueue并发队列执行异常及label作用的技术咨询

关于GCD并发调度队列的两个问题

代码示例

func myConcurrentQueue() {
    let concurrentQueue = DispatchQueue(label: "concurrent", attributes: .concurrent)
    concurrentQueue.async {
        print("Task 1 Con Start")
        print("Task 1 Con Finished")
    }
    concurrentQueue.async {
        print("Task 2 Con Start")
        print("Task 2 Con Finished")
    }
}

myConcurrentQueue()

预期与实际结果

预期执行结果:

Task 1 Con Start
Task 2 Con Start
Task 1 Con Finished
Task 2 Con Finished

实际执行结果为任务1完全执行完毕后,任务2才开始启动。


问题1:为何并发队列会产生这样的执行结果?

并发队列的核心是允许多个任务同时执行,但任务是否会并行启动,完全由系统根据当前CPU资源、线程池状态调度。你的任务只是两行打印代码,执行耗时极短,可能系统还没来得及为第二个任务分配新线程,第一个任务就已经跑完了。

如果给任务增加一点耗时操作,比如休眠0.1秒,就能看到明显的并发效果:

func myConcurrentQueue() {
    let concurrentQueue = DispatchQueue(label: "concurrent", attributes: .concurrent)
    concurrentQueue.async {
        print("Task 1 Con Start")
        Thread.sleep(forTimeInterval: 0.1) // 添加耗时操作
        print("Task 1 Con Finished")
    }
    concurrentQueue.async {
        print("Task 2 Con Start")
        Thread.sleep(forTimeInterval: 0.1) // 添加耗时操作
        print("Task 2 Con Finished")
    }
}

这时就能看到任务1启动后,任务2很快也启动,两者并行执行的结果。

问题2:DispatchQueue中的label属性是否会影响执行结果?

完全不会。label只是个调试用的标识符,作用是在Xcode调试面板、Instruments工具里区分不同队列,方便排查问题。它和队列的调度逻辑、并发特性没有任何关系,不管你设置什么字符串当label,队列的行为都不会变。


内容的提问来源于stack exchange,提问作者kkk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 03:57:22