dispatch_barrier_async, кажется, не влияет на глобальную очередь?
Когда я попробую функцию GCD dispatch_barrier_async
работает как положено в очереди, созданной dispatch_queue_create
в то время как когда я помещаю его в глобальную очередь, созданную dispatch_get_global_queue
кажется, барьер больше не работает = =, кто-нибудь может объяснить? спасибо ~ демонстрационное изображение
1 ответ
Это не удивительно, это задокументированное поведение.
Если вы используете это, чтобы добавить блок в очередь, которую вы создаете сами, то он будет блокировать все остальные блоки, пока не завершится. Если вы добавляете его в публичную очередь, он ведет себя так же, как dispatch_async
Документация по адресу https://developer.apple.com/reference/dispatch/1452797-dispatch_barrier_async
Который заявляет:
Указанная вами очередь должна быть параллельной очередью, которую вы создаете сами, используя функцию dispatch_queue_create. Если очередь, которую вы передаете этой функции, является последовательной очередью или одной из глобальных параллельных очередей, эта функция ведет себя как функция dispatch_async.
Глобальная очередь - это корневая очередь, которой управляет пул потоков, и вся родительская очередь пользовательской очереди. Это означает, что правило барьера, которым управляет корневая очередь, предназначено для пользовательских очередей, а не для самой глобальной очереди.
GCD exposes five different queues: the main queue running on the main thread,
three background queues with different priorities, and one background queue
with an even lower priority, which is I/O throttled. Furthermore, you can
create custom queues, which can either be serial or concurrent queues. While
custom queues are a powerful abstraction, all blocks you schedule on them
will ultimately trickle down to one of the system’s global queues and its
thread pool(s).
https://www.objc.io/issues/2-concurrency/concurrency-apis-and-pitfalls/