我知道队列不是线程。队列是GCD中比线程更高层次的概念。程序员只处理队列,让系统决定执行哪些线程 block 以获得最大效率。
而且我知道主队列绑定(bind)到主线程,这意味着如果我在主队列上放置一个 block ,只有主线程才会出队并运行它。我的问题是:主线程出队是否有可能从主队列以外的队列(串行或并发)阻塞?
最佳答案
问题:“主线程出队是否有可能从主队列以外的队列(串行或并发)阻塞?”
答案:“不。”
如果 GCD 允许提交到全局并发队列的 block 在主线程上运行,那么这些 block 也可能执行阻塞 UI 的长时间运行的操作,这既不好又违反 GCD 自己的设计原则。这也不是它的工作记录方式(如果您想确切了解 GCD 的工作原理,源代码始终是一个很好的引用,因为 GCD 也是开源的)。作为优化,一个 block 可能在当前线程上执行的唯一一次是在dispatch_sync()情况下,因为很明显,程序员不打算在该 block 之前返回到当前线程,以及它之前的任何排队 block ,在任何情况下都会完成,并且阻塞当前线程是预期行为,因此这并不奇怪。对于dispatch_async() 来说显然不是这样,因为该API 显然需要异步行为。
最后,为了澄清该答案中的另一个困惑点,dispatch_queue_create() 不仅创建串行队列 - 它还可以用于创建并发队列,因此并发队列执行并不是全局并发的唯一目的排队!请参阅第二个参数 - 它可以设置为 DISPATCH_QUEUE_CONCURRENT
创建并发队列(手册页有点过时,但 /usr/include/dispatch/queue.h
中的 HeaderDoc 是权威的)。
关于iOS GCD : main thread dequeue blocks from queues other than main queue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12851466/