iOS GCD : main thread dequeue blocks from queues other than main queue?

标签 ios multithreading grand-central-dispatch

我知道队列不是线程。队列是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/

相关文章:

c++ - 通过同一个 ssl 连接从多个线程发送请求

ios - RxSwift Realm 在 RunLoop 中观察 Array

ios - 将数据从模态转场传递给父级

ios - 移动以编程方式生成的按钮

ios - Square 的 iPhone 应用程序如何以编程方式检索用户的联系信息?

c++ - 通知线程是否总是需要在修改期间锁定共享数据?

ios - 更改一个 subview 的大小后如何触发自动布局?

javascript - Vaadin javascript 扩展中的并行 AJAX 调用

objective-c - GCD 计时器从不触发

swift - 并发队列中的 DispatchQueue 同步与同步屏障