Решить проблемы читателя-писателя с 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)?

Другие вопросы по тегам