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