美文网首页
GCD主队列同步任务死锁的理解

GCD主队列同步任务死锁的理解

作者: 随风流逝 | 来源:发表于2017-08-18 17:38 被阅读29次
    - (void)syncMain {
        dispatch_queue_t queue = dispatch_get_main_queue();
        dispatch_sync(queue, ^{
            NSLog(@"123");   });
    }
    

    在主队列中加入同步任务会造成死锁,这个在之前并没有很理解,只是知道会死锁,今天又碰到这个问题,感觉应该理解对了,举个例子说明一下。

    1. 比如有一天我不小心把身份证丢了,我就去派出所补办身份证,警察同志告诉我没有问题,可以补办,这时候我就有了一个任务,就是补办身份证(相当于主队列里的第一个任务:就是自信[self syncMain]方法)。
    2. 警察同志告诉我说补办身份证要证明我是我,这时候我就有了第二个任务(证明我是我),我就说你帮我补办出来身份证不就证明我是我了嘛,经常同志说你先证明你是你我才能帮你办身份证,然后……,相当于里面那个同步任务希望主队列帮他打印123(这时候主队列就有了第二个任务,打印123),主队列说不行我正在执行[self syncMain]方法,不能帮你打印123,同步任务说你帮我打印了123就是执行[self syncMain]方法,主队列说不行,我目前有任务在身,不能打印123,然后……,死锁就形成了
    3. 怎么解锁呢,这个时候如果有别的地方能证明我是我不就可以了,然后同步任务就说我到别的线程去执行123去,不找你了,然后一切OK
    dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        [self syncMain];
    });
    

    相关文章

      网友评论

          本文标题:GCD主队列同步任务死锁的理解

          本文链接:https://www.haomeiwen.com/subject/rdiarxtx.html