dispatch_sync()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dispatch_sync()相关的知识,希望对你有一定的参考价值。

参考技术A

平时我们可能很少用到 dispatch_sync ,只是知道,如果调用 dispatch_sync(dispatch_get_main_queue(), block) 的话,会阻塞主线程。但事实并非如此。另外,dispatch_sync() 和 dispatch_async() 可不仅仅是差了一个字母,也不仅仅是同步和异步的差别。
在看之前,建议首先要明确,队列、线程、任务,的关系。我发现很多人会把队列和线程搞混。一定要注意!

首先,dispatch_sync 的作用是,往某队列(第一个参数)中,添加一个同步任务(第二个参数)。

官方文档的解释如下:

下面举例说明:
(PS: queue 和 queue2 是 serial 还是 concurrent 对本例影响不大)

场景0:

在场景0中,是在主线程中,往主队列添加一个同步任务,结果就造成死锁,主线程被阻塞。是相互等待的情况。

在场景1中,首先是在主线程中,往 queue 添加一个异步任务;然后子线程中,又往queue添加一个同步任务,就和场景0的情况是一样的,会造成死锁。

场景2:

在场景2中,首先,是在主线程中,往queue添加一个异步任务;然后在子线程中,往queue2添加一个同步任务。这种情况不会死锁,可以正常运行。
最终,这两个任务都会在同一个线程中执行,假如第一个 NSLog 打印线程 number = 3,那么第二个NSLog打印的也一定是3, 因为会优先选择添加这个任务的线程

场景3:

首先,是在主线程中,往queue添加一个异步任务;然后在子线程中,往主队列添加一个同步任务。这种情况不会死锁,可以正常运行。
最终,第一个任务在子线程(比如number = 3)执行 ;第二个任务在主线程中执行,官方文档解释:除非第一个参数你传入了主队列。

总结
1. 队列中的任务,最终会由线程调度,GCD管理线程的生命周期。
2. dispatch_sync() 是线程同步操作,其作用就是阻塞线程,先让它的block执行完毕,才会返回。
3. dispatch_sync() 造成死锁的条件是:如果在同一个队列(不管是不是主队列)添加同步任务,就会死锁,反之则不会。

以上是关于dispatch_sync()的主要内容,如果未能解决你的问题,请参考以下文章

dispatch_sync

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

主队列上的 dispatch_sync 与 dispatch_async

如何从 dispatch_sync(dispatch_get_main_queue(), 发送/返回值到另一个页面

dispatch_sync添加到viewDidLoad卡死问题理解

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