Решите проблемы с читателями-читателями с помощью NSOperationQueue?

Я знаю, что можно решить проблемы чтения-записи в GCD с использованием барьеров. Поскольку я (обычно) стараюсь использовать NSOperationQueue вместо GCD, когда производительность не является ключевой проблемой, мне бы хотелось NSOperation -компонентное решение этой проблемы.

Я пытался написать свой собственный, но мое решение стало громоздким... наверняка кто-то уже решил эту проблему?

Кто-нибудь знает о NSOperation -компонентном решении проблемы чтения-записи?

Ответ 1

Как и в большинстве хакеров NSOperationQueue, вы можете использовать поддержку зависимостей между операциями:

  • Создайте подкласс NSBlockOperation, ReaderWriterBlockOperation. Добавьте к нему свойство BOOL writer.
  • Создайте очередь операций для каждого защищенного ресурса.
  • Остановить показ вашей очереди операций клиентам. Вместо этого выведите API -readWithBlock: и -writeWithBlock:. Обе помещают в ReaderWriterBlockOperation, один с writer == NO, другой == YES. Их работа управляет зависимостями следующим образом:
    • -readWithBlock: делает в блоке @synchronized(self) проверку операций от последнего до первого поиска блока записи. Если ни один не найден, он добавляет операцию и возвращает. Если он найден, он заставляет новый блок считывателя зависеть от писателя, завершает его и возвращает.
    • -writeWithBlock: делает то же самое. За исключением случаев, когда в операциях, находящихся в очереди, не обнаружено ни одного писателя, это заставляет блок зависеть от всех найденных читателей. Если он находится в операциях с очередью, он зависит от этой операции и всех последующих (считывающих) операций.

Это должно быть результатом блокировки всех читателей до тех пор, пока автор не завершит их до конца и не заблокирует всех авторов до тех пор, пока читатели не завершат их.

Одна из возможных проблем: я неясен (потому что документы не ясны, и я еще не реализовал это как таковые), если NSBlockOperation на самом деле ждет завершения своего блока до того, как объявит о завершении. Если это не так, вам нужно будет управлять этим самостоятельно в подклассе операции.

Все, что сказано, если система предоставляет рабочее решение, например барьерные блоки, вы должны это использовать. Вся эта система является взломом, чтобы получить очередь операций, чтобы сделать что-то, что очереди отправки были настроены для обработки очень хорошо. Если производительность на самом деле не вызывает беспокойства, то почему бы просто не использовать последовательную очередь (NSOperationQueue с максимальным количеством совпадающих операций == 1)?