美文网首页
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死锁问题

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