В чем разница serial и concurrent очередей и sync и async вызовов
Что проверяют
Понимаете ли вы, что это две независимые оси, и знаете ли, какая комбинация даёт зависание.
Как отвечать
Это два разных вопроса, и главное в ответе их не смешать.
Вид очереди определяет, как выполняются задачи внутри неё:
- последовательная: строго по одной, в порядке добавления. Следующая начнётся только после завершения предыдущей. Отсюда её роль защиты состояния: доступ сериализуется автоматически;
- конкурентная: несколько задач одновременно, порядок завершения не определён.
Способ отправки определяет, что делает вызывающий
- асинхронно: поставил задачу и сразу пошёл дальше;
- синхронно: поставил задачу и ждёт её завершения, блокируя свой поток.
Комбинации дают четыре варианта, и все осмысленны: асинхронно в последовательную это фоновая работа с сохранением порядка; синхронно в последовательную это чтение защищённого состояния; асинхронно в конкурентную это независимые параллельные задачи; синхронно в конкурентную это ожидание результата параллельной работы.
Теперь главное: синхронная отправка на очередь, в которой вы уже находитесь, даёт вечное зависание. Очередь ждёт завершения задачи, а задача не может начаться, пока очередь занята. Самый частый случай это синхронный вызов на главную очередь из главного потока.
Важное уточнение, которое часто понимают неверно: синхронная отправка не означает выполнение на текущем потоке. Задача принадлежит очереди, просто система в качестве оптимизации нередко выполняет её на вызывающем потоке, чтобы не переключаться.
Ещё одна деталь по конкурентной очереди: барьер. Задача с этим флагом выполняется в одиночку, дождавшись всех предыдущих. Это и даёт схему с множеством читателей и единственным писателем.
Практическое правило: по умолчанию асинхронно, синхронно только для короткого доступа к состоянию и никогда на собственную очередь.
Где спотыкаются
Смешивают вид очереди и способ отправки.
Вызывают синхронную отправку на главную очередь из главного потока.
Считают, что синхронная отправка выполняет код на текущем потоке.
Используют синхронную отправку для ожидания сетевого ответа.