dispatch_barrier_sync死锁问题

2018-09-26  本文已影响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
}
上一篇下一篇

猜你喜欢

热点阅读