从并发队列中调用 dispatch_sync - 它是不是完全阻塞?

Posted

技术标签:

【中文标题】从并发队列中调用 dispatch_sync - 它是不是完全阻塞?【英文标题】:Calling dispatch_sync from a concurrent queue - does it block entirely?从并发队列中调用 dispatch_sync - 它是否完全阻塞? 【发布时间】:2015-06-15 04:27:44 【问题描述】:

假设我从并发队列中调用 dispatch_sync - 它是阻塞整个队列还是仅仅阻塞执行线程?

【问题讨论】:

【参考方案1】:

dispatch_sync 将阻塞调用者线程,直到执行完成,并发队列有多个线程,因此它只会阻塞该队列中的一个,其他线程仍将执行。

这是 Apple 对此的评价:

将块提交到调度队列以同步执行。不像 dispatch_async,这个函数在块有之前不会返回 完成的。调用此函数并定位当前队列 导致死锁。

与 dispatch_async 不同,不会在目标上执行保留 队列。因为对该函数的调用是同步的,所以它“借用”了 调用者的参考。此外,没有对 Block_copy 执行 块。

作为一种优化,此函数调用当前块 尽可能线程。

Source

【讨论】:

... 隐含答案:不,它不会阻塞整个并发队列,因为并发队列由多个线程组成。 感谢您接听汤米,我误读了这个问题。我已经更新了我的答案。

以上是关于从并发队列中调用 dispatch_sync - 它是不是完全阻塞?的主要内容,如果未能解决你的问题,请参考以下文章

dispatch_sync()

主队列中添加的同步操作(dispatch_sync)永远不会被执行,会死锁原因

为啥我们不能在当前队列上使用 dispatch_sync?

主队列上的 dispatch_sync 与 dispatch_async

Dispatch Queues调度队列

为啥从并发队列异步调用`DispatchQueue.main.sync`成功但同步失败?