今天在项目中遇到了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
}
网友评论