Я обсуждаю, следует ли перейти к шаблону на основе GCD для многопоточных аксессуаров. Я использую пользовательскую синхронизацию на основе блокировки в аксессорах в течение многих лет, но я нашел некоторую информацию (Intro to GCD), и, похоже, существуют плюсы подхода на основе GCD. Я надеюсь начать диалог здесь, чтобы помочь себе, а другие взвешивают решение.Многопоточные объективы Objective-C: GCD vs locks
картина выглядит следующим образом:
- (id)something
{
__block id localSomething;
dispatch_sync(queue, ^{
localSomething = [something retain];
});
return [localSomething autorelease];
}
- (void)setSomething:(id)newSomething
{
dispatch_async(queue, ^{
if(newSomething != something)
{
[something release];
something = [newSomething retain];
[self updateSomethingCaches];
}
});
}
На про стороне: вы получаете преимущество, возможно, не блокируя доступ на запись; более низкие накладные расходы, чем блокировки (возможно?); безопасность от забывания до разблокировки перед возвратом из критических разделов кода; другие?
Недостатки: Обработка исключений не существует, поэтому вам необходимо закодировать ее в каждом блоке, в котором она может понадобиться.
Является ли этот шаблон потенциально рекомендуемым методом написания многопоточных аксессуаров?
Существуют ли стандартные подходы для создания диспетчерских очередей для этой цели? Другими словами, лучшие практики для торговли от гранулярности? Например, с помощью замков блокировка для каждого атрибута более тонкая, чем блокировка на всем объекте. С очередями отправки я мог представить себе, что создание одной очереди для всех объектов создавало бы узкие места производительности, поэтому подходят ли очереди на объекты? Очевидно, что ответ сильно зависит от конкретного приложения, но есть известные компромиссы с производительностью, чтобы помочь оценить возможность подхода.
Любая информация/понимание будет оценено по достоинству.
Точно так же, как точки данных, очереди и блокировки pthread имеют одинаковый «вес» (80 байт против 64 байт, сопоставимое время сбора данных), но использование очередей вместо явных потоков экономит проводную память для потоков на стороне ядра (если только вы тщательно управляйте своими явными потоками жизни через какой-то пул) –