dispatch_sync и dispatch_async dispatch_sync выполняет вызов синхронно: текущий поток блокируется до окончания задачи dispatch_async выполняет вызов асинхронно: управление возвращается сразу, а задача помещается в очередь Обе функции работают поверх GCD (Grand Central Dispatch) и очередей задач При вызове dispatch_sync задача немедленно добавляется в очередь, после чего вызывающий поток ожидает её завершения dispatch_async отправляет задачу в очередь и сразу передаёт управление обратно вызывающему коду Использование dispatch_sync на той же очереди способно привести к deadlock dispatch_async повышает производительность, позволяя выполнять…
Чем отличаются dispatch_sync и dispatch_async и как они работают под капотом?
dispatch_sync и dispatch_async dispatch_sync выполняет вызов синхронно: текущий поток блокируется до окончания задачи dispatch_async выполняет вызов асинхронно: управление возвращается сразу, а задача помещается в…
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
dispatch_sync и dispatch_async
- dispatch_sync выполняет вызов синхронно: текущий поток блокируется до окончания задачи
- dispatch_async выполняет вызов асинхронно: управление возвращается сразу, а задача помещается в очередь
- Обе функции работают поверх GCD (Grand Central Dispatch) и очередей задач
- При вызове dispatch_sync задача немедленно добавляется в очередь, после чего вызывающий поток ожидает её завершения
- dispatch_async отправляет задачу в очередь и сразу передаёт управление обратно вызывающему коду
- Использование dispatch_sync на той же очереди способно привести к deadlock
- dispatch_async повышает производительность, позволяя выполнять задачи параллельно и не блокировать UI
- Обе функции применяются для управления потоками и организации асинхронного выполнения
Ключевое отличие заключается в блокирующем синхронном вызове и неблокирующей асинхронной отправке задачи в очередь.
Подробный ответ
Основной ответ
dispatch_sync и dispatch_async — функции GCD (Grand Central Dispatch), используемые в iOS/macOS для управления очередями выполнения задач. Их главное различие состоит в поведении вызывающего потока: dispatch_sync блокирует вызывающий поток до завершения задачи, тогда как dispatch_async помещает задачу в очередь и сразу возвращает управление, не ожидая получения результата.
Внутри dispatch_sync блок добавляется в очередь, а текущий поток приостанавливается до момента завершения этого блока. dispatch_async, напротив, только передаёт блок в очередь для последовательного или параллельного выполнения, поэтому вызывающий поток может продолжить работу, не дожидаясь окончания задачи.
Ключевые моменты
- Блокировка потока:
dispatch_sync— синхронный вызов, который блокирует поток, вызвавший блок, и при некорректном применении может вызвать дедлок, например при отправке задачи в ту же очередь.dispatch_asyncне блокирует вызывающий поток и допускает параллельное выполнение задач. - Исполнение очереди: При вызове
dispatch_syncзадача запускается в переданной очереди, а вызывающий поток ожидает её завершения. В случаеdispatch_asyncзадача также передаётся в очередь, но ожидания со стороны вызывающего потока нет, поэтому UI-поток сохраняет отзывчивость. - Под капотом в GCD: Для выполнения используются конкурентные/серийные очереди. При работе
dispatch_syncприменяются системные низкоуровневые механизмы синхронизации (semaphores или condition variables), блокирующие вызвавший поток до завершения задачи.dispatch_asyncпередаёт задачу в очередь асинхронно с использованием не блокирующих системных вызовов, таких какdispatch_mach_send.
Практический контекст
На практике dispatch_async часто выбирают для отложенного или фонового выполнения: например, для сетевых запросов и обработки данных в фоне, чтобы UI оставался отзывчивым. dispatch_sync подходит, когда продолжать работу можно только после гарантированного завершения задачи — например, при корректной инициализации или синхронизации состояния. Однако использовать его нужно осторожно, чтобы не допустить дедлоков, особенно на главной очереди.