В чем разница (преимущества и недостатки) между использованием DispatchGroup и NSRecursiveLock? - PullRequest
1 голос
/ 25 сентября 2019

В чем разница (преимущество и недостаток) между использованием DispatchGroup и NSRecursiveLock?

Похоже, они делают одно и то же.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Замки и группы служат совершенно разным целям.При работе с рядом одновременных задач:

  • Блокировка обычно используется для предотвращения / блокировки одновременного взаимодействия этих задач с некоторым общим, не поточно-ориентированным ресурсом.

  • Группа обычно используется для определения того, когда все эти параллельные задачи завершены (независимо от порядка, в котором они были завершены).

Например, при обработкепараллельно с серией изображений, вы можете использовать блокировку или аналогичный механизм для обновления какого-либо свойства (например, массива результатов), тогда как группы диспетчеризации используются, чтобы знать, когда все эти параллельные задачи выполнены.

0 голосов
/ 26 сентября 2019

Основное отличие состоит в том, что DispatchGroup ближе к счетному семафору с обратным вызовом, тогда как NSLock - это простой мьютекс .

Например, DispatchGroup может быть enter отредактировано более одного раза, одним или несколькими потоками, и enter с DispatchGroup никогда не заблокирует вызывающий поток.Вызывающие потоки также отвечают за балансировку каждого enter вызова с помощью вызова leave.Если в группе зарегистрирован обратный вызов notify, он будет выполнен, как только число enter с минус число leave с достигнет 0. Хорошим примером использования DispatchGroup будет создание нескольких сетейзапросы и имеют один фрагмент кода обратного вызова, выполняемый после того, как все сетевые запросы завершены (или истекло время ожидания и т. д.).

Однако, если один поток lock s NSLock, любой другой поток (или даже тот же самый поток, в этом отношении) пытается lock это снова, прежде чем это будет unlock ed, второй поток будет заблокирован, пока это не будет unlock ed (и возможно никогда, если вы попытаетесь lockэто дважды из одной и той же ветки).Хорошим примером использования NSLock является предоставление многопоточного доступа к одному изменяемому фрагменту данных.В этом случае несколько потоков могут быть уверены, что могут получать согласованные операции чтения и записи в / из изменяемого хранилища без потенциального вытеснения друг друга.

NSLock (и мьютексы в целом) являются примитивом синхронизации гораздо более низкого уровня, чемDispatchGroup.В общем, вы всегда должны использовать примитив самого высокого уровня, который достигает вашей цели.Если DispatchGroup выполнит эту работу, используйте ее и игнорируйте NSLock.

...