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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主队列中添加的同步操作(dispatch_sync)永远不会被执行,会死锁原因相关的知识,希望对你有一定的参考价值。

参考技术A 如题涉及到的三个对象: 主队列 ,  同步添加任务:dispatch_sync(main_queue,block) , 所添加的任务:block;

一.主队列特点: 后面的任务必须等待前面的任务执行完成才可以进行执行,不能插队;

二.同步添加任务:dispatch_sync( main_queue,block )函数的特点: 必须等待其所提交的任务block执行完成,此函数才能返回,函数返回后,此函数才算执行完成;

三.所添加的任务:block:  由于此任务由于被dispatch_sync()添加到了主队列,再根据主队列的特点,所以此任务必须等待dispatch_sync()函数执行完成之后才能进行执行;再结合第二点,dispatch_sync()函数必须等待block任务执行完成才能返回.所以造成死锁;

举例:

现在有三个人:老板, 你, 亚飞;

用上三个人 模拟同步提交任务到主队列:dispatch_sync(main_queue,block)

用上三个人 模拟异步提交任务到主队列:dispatch_async(main_queue,block)

以上是关于主队列中添加的同步操作(dispatch_sync)永远不会被执行,会死锁原因的主要内容,如果未能解决你的问题,请参考以下文章

关于GCD中同步函数+主队列产生死锁的一点理解

从主队列调用 dispatch_sync 并且执行的块保存到核心数据时 iOS 死锁

主队列上的 dispatch_sync 与 dispatch_async

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

Dispatch Queues调度队列

dispatch_sync添加到viewDidLoad卡死问题理解