Выбор ответа Middle GCD и OperationQueue обновлено

Барьер для потокобезопасного кеша

Вопрос

Как сделать кеш с параллельным чтением и эксклюзивной записью на GCD?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Своя concurrent-очередь: чтение sync, запись async(.barrier). Барьерный блок ждёт окончания всех текущих блоков, выполняется один, и только потом очередь продолжает остальные.

Варианты ответа

  1. Глобальная очередь .global(): чтение через sync, запись с барьером
  2. Serial-очередь: запись через sync, а чтение через async без ожидания
  3. Чтение и запись через DispatchQueue.main.async
  4. Своя concurrent-очередь: чтение sync, запись async(.barrier)правильный ответ

Разбор

Барьерный блок ждёт окончания всех текущих блоков, выполняется один, и только потом очередь продолжает остальные. Это паттерн reader-writer. Работает только на своей concurrent-очереди: на глобальных очередях флаг барьера игнорируется. Serial-очередь тоже безопасна, но читает строго по одному, а чтение через async не вернёт значение вызывающему. Главная очередь для кеша лишняя нагрузка на UI.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме