Синхронизация DispatchQueue против барьера синхронизации в параллельной очереди - PullRequest
2 голосов
/ 04 октября 2019

Я проходил через барьер DispatchQueue и заметил, что есть два пути: async(flags: .barrier) и sync(flags: .barrier)

Я понял использование асинхронного барьера, но перепутал с синхронизирующим барьером.

Мое замешательство, задача, которую я хочу сделать, может быть выполнена с этим также

DispatchQueue.global().sync {

}

тогда, какова польза от барьера синхронизации? Почему они используются? и как отличается в этом.

DispatchQueue.global().sync(flags: .barrier) {

}

Ответы [ 2 ]

2 голосов
/ 04 октября 2019

В Лутц говорит (+1), sync / async и барьеры - это две совершенно разные проблемы. sync / async определяет поведение вызывающего потока (т. Е. Ожидает или нет). Барьеры определяют поведение очереди, в которую она была отправлена ​​(разрешено ли одновременное выполнение с другими отправленными блоками этой очереди).

Обратите внимание, что барьеры не работают в глобальных очередях;они влияют только на частные параллельные очереди, которые вы создали. Как сказано в документах о барьерах:

Указанная вами очередь должна быть параллельной, которую вы создаете сами ... Если очередь, которую вы передаете этой функции, является последовательной очередьюили одна из глобальных параллельных очередей, эта функция ведет себя [как если бы она была отправлена ​​без барьера].

2 голосов
/ 04 октября 2019

Здесь необходимо учитывать две разные вещи:

Sync / Asyc определяет поток программы в очереди отправки: использование sync() приводит к блокировке выполнения в очереди отправки дозадание выполнено;напротив, использование async() не будет блокировать.

Использование флага .barrier, однако, влияет на способ выполнения блоков в очереди, в которую они были отправлены (очевидно,это имеет значение только для параллельных очередей):

Блок, представленный с этим флагом, будет действовать как барьер: все другие блоки, которые были отправлены до , барьер закончится, и только после этого барьерблок выполнится. Все блоки, представленные после , барьер не начнут, пока барьер не закончится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...