Чем отличаются 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 повышает производительность, позволяя выполнять…

Подробный разбор

Ответ с пояснениями

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 подходит, когда продолжать работу можно только после гарантированного завершения задачи — например, при корректной инициализации или синхронизации состояния. Однако использовать его нужно осторожно, чтобы не допустить дедлоков, особенно на главной очереди.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку