我知道队列不是线程。队列是比 GCD 中的线程更高层次的概念。程序员只处理队列,让系统决定哪些线程执行块以获得最大效率。
而且我知道主队列绑定到主线程,这意味着如果我在主队列上放置一个块,只有主线程会出列并运行它。我的问题是:除了主队列之外,主线程是否有可能从队列(串行或并发)中出列块?
我知道队列不是线程。队列是比 GCD 中的线程更高层次的概念。程序员只处理队列,让系统决定哪些线程执行块以获得最大效率。
而且我知道主队列绑定到主线程,这意味着如果我在主队列上放置一个块,只有主线程会出列并运行它。我的问题是:除了主队列之外,主线程是否有可能从队列(串行或并发)中出列块?
问题:“主线程是否有可能从队列(串行或并发)除主队列之外的队列中取出阻塞?”
回答:“没有。”
如果 GCD 允许提交到全局并发队列的块在主线程上运行,那么这些块也可能执行阻塞 UI 的长时间运行的操作,这既不好,也违背了 GCD 自己的设计原则。它也不是如何工作的文档(如果您想确切了解 GCD 的工作原理,源代码始终是一个很好的参考,因为 GCD 也是开源的)。唯一可能在当前线程上执行块作为优化的时间是在 dispatch_sync() 情况下,因为很明显程序员不打算在该块之前返回当前线程,并且在它之前的任何排队块, 在任何情况下都完成并且阻塞当前线程是预期的行为,所以这并不奇怪。dispatch_async() 显然不是这样,因为该 API 显然需要异步行为。
最后,为了澄清该答案中的另一个混淆点,dispatch_queue_create() 不仅创建串行队列 - 它还可以用于创建并发队列,因此并发队列执行不是全局并发队列的唯一提供!请参阅第二个参数 - 它可以设置DISPATCH_QUEUE_CONCURRENT
为创建并发队列(手册页有点过时,但 HeaderDoc 中/usr/include/dispatch/queue.h
的权威性)。
如果您使用dispatch_sync
. 的文档是dispatch_sync
这样说的:
作为一种优化,此函数在可能的情况下调用当前线程上的块。
所以如果你dispatch_sync
在主线程上使用,它可能会在主线程上执行块。