Какой поток блокируется при вызове sync в Grand Central Dispatch (GCD)?

«Какой поток блокируется при вызове sync в Grand Central Dispatch (GCD)?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При вызове DispatchQueue.sync блокируется текущий поток, с которого был выполнен этот вызов. Поток приостанавливается и ожидает, пока задача, отправленная в очередь, не будет выполнена полностью.

Пример и порядок выполнения:

print("1. Перед sync")

// Текущий поток (например, main) блокируется здесь
DispatchQueue.global().sync {
    for i in 2...4 { print("(i). Внутри sync-блока") }
}

// Эта строка выполнится только после завершения блока выше
print("5. После sync")
// Вывод: 1, 2, 3, 4, 5

Критически важное предупреждение:

  • Deadlock (взаимная блокировка): Вызов DispatchQueue.main.sync из того же main thread приведёт к deadlock, так как поток будет ждать завершения задачи, которую он же и должен выполнить.
    // НЕ ДЕЛАЙТЕ ТАК! Это вызовет deadlock на главном потоке.
    DispatchQueue.main.sync {
    print("Этот код никогда не выполнится")
    }
  • Использование: sync полезен, когда вам нужно дождаться результата на текущем потоке, например, для синхронизации доступа к общему ресурсу.