iOS GCD:主线程从主队列以外的队列中出列块?

时间:2012-10-12 02:41:38

标签: ios multithreading grand-central-dispatch

我知道队列不是线程。队列是一个比GCD中的线程更高级别的概念。程序员只处理队列,让系统决定执行哪些线程以获得最大效率。

我知道主队列绑定到主线程,这意味着如果我在主队列上放置一个块,只有主线程将出列并运行它。我的问题是:主线程是否可能从队列(串行或并发)中排除队列以外的队列?

2 个答案:

答案 0 :(得分:3)

问题:“除了主队列之外,主线程是否可能从队列(串行或并发)中出列块?”

答案:“不。”

如果GCD允许提交到全局并发队列的块在主线程上运行,那么这些块也可能执行阻塞UI的长时间运行操作,这既不好也不符合GCD自己的设计原则。它也不是如何记录工作的(如果你想知道完全 GCD是如何工作的,源代码总是一个很好的参考,因为GCD也是开源的)。作为优化的一个块可能在当前线程上执行的唯一一次是在dispatch_sync()情况下,因为很明显程序员不打算在该块之前返回当前线程,并且在它之前的任何排队块都是,在任何情况下完成并阻止当前线程是预期的行为,因此毫不奇怪。对于dispatch_async()来说,情况显然不同,因为使用该API显然需要异步行为。

最后,为了清除该答案中的另一个混淆点,dispatch_queue_create()不仅创建了串行队列 - 它还可以用于创建并发队列,因此并发队列执行不是全局并发的唯一意义队列!请参阅第二个参数 - 可以将其设置为DISPATCH_QUEUE_CONCURRENT以创建并发队列(手册页有点过时,但/usr/include/dispatch/queue.h中的HeaderDoc是权威的。)

答案 1 :(得分:1)

您可以使用dispatch_syncThe documentation for dispatch_sync说:

  

作为优化,此函数会在可能的情况下调用当前线程上的块。

因此,如果在主线程上使用dispatch_sync,它可以在主线程上执行块。