Swift调度队列异步执行顺序

时间:2019-03-04 10:00:14

标签: swift grand-central-dispatch

考虑这段琐碎的代码

DispatchQueue.global().async {
    print("2")
}

print("1")

我们可以说输出如下:

1
2

在任何情况下执行顺序都会有所不同(不管使用的队列类型如何)?可以强迫他们手动显示吗?

1 个答案:

答案 0 :(得分:2)

您说:

  

我们可以说输出如下...

不,充其量您只能说输出将经常/经常按该顺序输出,但不能保证一定如此。

该代码段将异步地将代码分发到全局并发队列,该队列将在单独的工作线程上运行它,并且在没有任何同步的情况下,您在当前线程与该工作线程之间具有经典的竞争条件。尽管实际上,您经常会在print之前看到1,但不能保证这些2语句的顺序。

  

这是技术面试中的常见问题之一;出于某些原因,访问员期望得出结论,此处的执行顺序是恒定的。因此(由于它与我的理解不一致),我决定进行澄清。

您的理解是正确的,绝对不能保证这两个print语句的顺序。

  

在任何情况下执行顺序都会不同

一些想法:

  1. 例如,通过调整队列优先级,可以更改1出现在2之前的可能性。但是,同样,不能保证。

  2. 有多种机制可以保证顺序。

    • 您可以使用串行队列...我想您不想考虑使用另一个/不同的队列,但这通常是正确的解决方案,因此,在那种情况下,关于该主题的任何讨论都是不完整的;
    • 您可以使用调度组...当当前队列满足组时,可以在全局队列上notify
    • 您可以使用调度信号量...信号量是该问题的经典答案,但是IMHO信号量应谨慎使用,因为这样很容易犯错误...再加上阻塞线程绝不是一个好主意;
    • 出于完整性考虑,我们应该提到您确实可以使用任何synchronization机制,例如锁。