串行队列内的并发队列调用



在Objective-C和Swift中,是否保证在串行队列的异步块内进行并发调用的执行顺序?

伪代码:

let serialQueue = SerialQueue()
let concurrentQueue = ConcurrentQueue()
serialQueue.async { // 1
concurrentQueue.async { // 2
run_task1() // task that takes 1 hour
}
}
serialQueue.async { // 3
concurrentQueue.async { // 4
run_task2() // task that takes 1 minute
}
}

在上面的代码中,task1是否保证在task2被调用之前完成?

或者,由于它们是在并发线程上调用的,所以串行队列async只保证run_task1将在run_task2之前被添加到concurrentQueue,而不能保证执行顺序?

我已经对你的问题中的块进行了编号,所以我可以在这里引用它们:

块1和块3都在串行队列上运行,因此块3将只在1完成后运行。

然而,块1和块3实际上并没有等待task1/2,它们只是排队等待块2和块4中异步发生的工作,这几乎立即完成。

从那时起,任务1和任务2将同时运行,并以任意顺序完成。唯一的保证是任务1将在任务2之前启动。


我总是喜欢用点披萨和做披萨的比喻。排队异步工作就像点披萨一样。这并不意味着你马上就做好了披萨,而且在披萨店烤披萨的时候,你不会被阻止做其他事情。

你的1号和3号区块是严格订购的,所以1号区块将在3号区块开始之前完成。然而,这个街区所做的就是点一份披萨,而且速度很快。这确实意味着披萨1(任务1(在披萨2(任务2(之前完成,这只是意味着你在打第二个电话之前先打了第一个电话。

最新更新