美文网首页
dispatch_barrier_sync死锁问题

dispatch_barrier_sync死锁问题

作者: 三生之二 | 来源:发表于2018-09-26 14:35 被阅读2次

今天在项目中遇到了dispatch_barrier_sync死锁问题。dispatch_barrier_sync中,添加的任务执行完之后,依然在当前线程调用了operation的finish函数,导致回调的block也在这个线程中执行。但是在block中执行某些操作又调用了同一个dispatch_barrier_sync导致了死锁。和在当前线程中进行dispatch_syn()同理。
代码大致相当于如下:

- (void)addOperation {
    dispatch_barrier_sync(self.barrierQueue, ^{
        OperationA *operation = xxx;
        [operations setObject:operation forKey:xxx];
    });
}

dispatch_barrier_sync(self.barrierQueue, ^{
     NSString *key = xxx;
     OperationA *operation = operations[key];
     [operation finish];
});

- (void)finish {
    xxx
    block();
    xxx
}

block = ^{
    [xxx addOperation];
}

解决办法:在执行完任务之后,返回的block放到主线程中调用。

即修改finish方法如下:

- (void)finish {
    xxx
    dispatch_async(dispatch_get_main_queue(), ^{
        block();
    }
    xxx
}

相关文章

  • dispatch_barrier_sync死锁问题

    今天在项目中遇到了dispatch_barrier_sync死锁问题。dispatch_barrier_sync中...

  • dispatch_barrier

    dispatch_barrier_sync

  • jstack命令:教你如何排查多线程问题

    这是之前的一个死锁案例: 一个多线程死锁案例,如何避免及解决死锁问题? 如程序中发生这样的死锁问题该如何排查呢?我...

  • 死锁问题

    产生死锁的四个必要条件: (1) 互斥条件:一个资源每次只能被一个进程使用。 (2) 请求与保持条件:一个进程因请...

  • 死锁问题

    判断是否死锁 终极方法是判断死锁问题产生的根源是dispatch_sync 是否是发生在当前dispatch_s...

  • 死锁问题

    记得以前看过一个笑话:面试官问死锁怎么回事儿?我想了想,然后回答面试官说你先发offer给我,我再回答你。这就是现...

  • 01-iOS多线程 ——图解死锁

    死锁 - 死锁问题,是iOS开发中必须要理解的问题,可能光看一些讲解死锁的代码并不是很容易理解。我制作了下面这幅图...

  • 分布式数据库系列-死锁处理

    死锁检测 假如我们允许发生死锁并且依赖于死锁检测,那么分布式系统中的主要问题就是如何维护等待图,。处理这个问题的常...

  • 并发insert on duplicate key update

    前言 数据库死锁问题,是一个老生常谈且很常见的问题,网上也有非常多对于各类死锁场景的解析和复现,但凡和死锁有关,无...

  • 记spring事务传播机制引发连接池死锁问题及解决方案

    公司项目开发时,遇到了一个死锁问题,项目会时不时的死掉,于是开始了对死锁问题的排查。 偶然间,项目再一次出现了死锁...

网友评论

      本文标题:dispatch_barrier_sync死锁问题

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