У меня есть класс target-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
}];
Мне это решение не нравится, потому что для каждого блока с разным типом возврата нужно писать другой метод. Более того, эта проблема кажется мне очень распространенной, и я думаю, что для нее должно существовать более красивое стандартное решение.
@synchronized
? - person Martin R   schedule 21.10.2013@synchronized
- это классическая блокировка, не основанная на GCD/очередях, и поэтому, насколько я понимаю, ее не рекомендуется использовать из соображений простоты кода и производительности. Таким образом, заголовок этого вопроса вводит в заблуждение, поскольку содержит блокировку. Я имею в виду синхронизацию доступа реентерабельным способом с GDC/очередями. У меня просто не было лучших слов, чем «реентерабельная блокировка», потому что именно так называется решение проблемы, известное большинству людей. - person Daniel S.   schedule 21.10.2013@synchronized
имеет то преимущество, что приводит к более простому коду для реентерабельного -независимо- (как это лучше назвать?). Тем не менее, механизм блокировки, стоящий за ним, имеет меньшую производительность, чем механизм, лежащий в основе очередей GCD. - person Daniel S.   schedule 21.10.2013