dispatch_sync 死锁该怎么理解?

dispatch_sync(dispatch_get_main_queue(), ^{NSLog(@"Hello?");});

如果dispatch_sync()的目标queue为当前queue,会发生死锁(并行queue并不会).

我们知道dispatch_sync会阻塞上下文任务,当前上下文为主队列,而主队列是串行队列,加入的任务要按顺序执行,所以新加入的任务要排在上下文任务之后执行,即排在dispatch_sync执行完成之后,新任务(block任务)等待dispatch_sync执行完成后执行,而dispatch_sync需要等待block中的代码执行完毕后继续向下执行,因此造成相互等待的情况,死锁形成。

参考这张图片来理解一下这个问题

20180919153734638295780.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,712评论 8 265
  • 从哪说起呢? 单纯讲多线程编程真的不知道从哪下嘴。。 不如我直接引用一个最简单的问题,以这个作为切入点好了 在ma...
    Mr_Baymax阅读 2,846评论 1 17
  • 一:base.h 二:block.h 1. dispatch_block_flags:DISPATCH_BLOCK...
    小暖风阅读 2,524评论 0 0
  • iOS多线程编程 基本知识 1. 进程(process) 进程是指在系统中正在运行的一个应用程序,就是一段程序的执...
    陵无山阅读 6,153评论 1 14
  • 下班的时间到了,会期盼着早点回去,希望正好赶上公交,可以早点到住得地方。 每次等公交都是个漫长的过程,这是相对每次...
    行百里者半九十阅读 199评论 0 0