В объективе-c есть (по крайней мере) два подхода к синхронизации одновременных доступов к общему ресурсу. Более старый подход, основанный на блокировке, и новый подход с Grand Central Dispatch (GCD), для последнего с помощью dispatch_sync для отправки всех обращений в общую очередь.Имеет ли диспетчер_sync концептуальное преимущество перед блокировкой?
В заявке Concurrency Programming Guide, section Eliminating Lock-Based Code указано, что «использование замков происходит за счет стоимости. Даже в непротивостоящем случае всегда существует штраф за исполнение, связанный с блокировкой».
Является ли это аргументом в пользу подхода GCD?
Я думаю, что это не по следующей причине:
Очередь должна иметь список задач, поставленных в очередь, чтобы сделать. Один или несколько потоков могут добавлять задачи в этот список через dispatch_sync, и один или несколько рабочих потоков должны удалить элементы из этого списка для выполнения задач. Это должно быть защищено замком. Таким образом, нужно также запереть замок.
Скажите, пожалуйста, если есть какой-либо другой способ, как очереди могут сделать это без блокировки, о которой я не знаю.
ОБНОВЛЕНИЕ: Далее в руководстве подразумевается, что есть что-то, о чем я не знаю: «задача очереди не требует захвата в ядро для получения мьютекса».
Как это работает?
Это может быть интересно: http: // stackoverflow.ком/вопросы/17599401/какой-преимущества-делает-диспетчерская-синхронизация уже поверх синхронизируется. –