GCD死锁的理解

- (void)viewDidLoad {
    [super viewDidLoad];
    [self sync];
}
- (void)sync {
    dispatch_queue_t queue = dispatch_get_main_queue();
    NSLog(@"Thread--%@", [NSThread currentThread]);
    dispatch_sync(queue, ^{
        NSLog(@"sync1--%@", [NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"sync2--%@", [NSThread currentThread]);
        dispatch_sync(queue, ^{
    });
    dispatch_sync(queue, ^{
        NSLog(@"sync3--%@", [NSThread currentThread]);
    });
}
  1. 以上代码会造成死锁,原因是viewDidLoad函数会在主线程执行,当主线程中有任务在执行时,主队列内的任务会被阻塞。当代码执行到dispatch_sync时,会将block内的代码放入主队列。因为主队列被viewDidload阻塞了,所以block不会被执行。而dispatch_sync是同步函数,需要block执行完毕后才会返回,所以viewDidload和block相互阻塞,形成死锁。
  2. 如果将同步函数队列换成其他的其他队列,无论是串行队列还是并行队列都不会造成死锁。因为viewDidload被block阻塞时,block和viewDidload不在同一队列,block不会被viewDidload阻塞,当block自行完毕后viewDidload也会继续执行。
  3. 所以GCD的死锁和线程无关,是因为队列的阻塞造成了任务的相互阻塞才形成死锁。如果两个任务不在同一队列内就不会造成死锁。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从哪说起呢? 单纯讲多线程编程真的不知道从哪下嘴。。 不如我直接引用一个最简单的问题,以这个作为切入点好了 在ma...
    Mr_Baymax阅读 2,833评论 1 17
  • 因为本文只做分享用,非学术性文章,所以某些理论并不是非常严谨,望大家见谅。写下这篇文章有以下的目: 我写这篇文章时...
    写Blog不取名阅读 6,937评论 33 77
  • GCD 深入理解:第一部分 什么是 GCD GCD 是 libdispatch 的市场名称,而 libdispat...
    willphonez阅读 647评论 0 2
  • 虽然 GCD 已经出现过一段时间了,但不是每个人都明了其主要内容。这是可以理解的;并发一直很棘手,而 GCD 是基...
    随风飘荡的小逗逼阅读 1,376评论 0 2
  • 文/冰紫嫣 图/来自网络 时光无声的脚步 从不曾痴情的为谁停留 它总是匆匆的路过 世上每个相同又不同的生命 值得等...
    冰紫嫣原创阅读 325评论 0 2