我有一个带有一些方法的objective-c 类,它使用GCD 队列来确保对资源的并发访问是串行发生的(执行此操作的标准方法)。
其中一些方法需要调用同一类的其他方法。所以锁定机制需要是可重入的。有没有标准的方法来做到这一点?
起初,我使用了这些方法中的每一个
dispatch_sync(my_queue, ^{
// Critical section
});
同步访问。如您所知,当其中一个方法调用另一个这样的方法时,会发生死锁,因为 dispatch_sync 调用会停止当前执行,直到执行另一个块,这也无法执行,因为队列上的执行已停止。为了解决这个问题,我使用了例如这个方法:
- (void) executeOnQueueSync:(dispatch_queue_t)queue : (void (^)(void))theBlock {
if (dispatch_get_current_queue() == queue) {
theBlock();
} else {
dispatch_sync(queue, theBlock);
}
}
在我的每一种方法中,我都使用
[self executeOnQueueSync:my_queue : ^{
// Critical section
}];
我不喜欢这个解决方案,因为对于每个具有不同返回类型的块,我需要编写另一个方法。此外,这个问题对我来说很常见,我认为应该有一个更好的标准解决方案。