Я пытаюсь понять, как правильно использовать Grand Central Dispatch (GCD) для реализации модели одновременной монопольной чтения, контролирующей доступ к ресурсу.
Предположим, существует NSMutableDictionary, который много читается иодин раз в некоторое время обновляется.Как правильно обеспечить, чтобы чтение всегда работало с согласованным состоянием словаря?Конечно, я могу использовать очередь и сериализовать все права на чтение и запись в словарь, но это излишне сериализует чтения, которым должен быть разрешен одновременный доступ к словарю.Сначала использование групп здесь звучит многообещающе.Я мог бы создать группу для чтения и добавить в нее все операции чтения.Это позволит одновременно выполнять чтение.И затем, когда придет время сделать обновление, я могу использовать dispatch_notify () или dispatch_wait () как часть операции записи, чтобы убедиться, что все чтения завершены, прежде чем разрешено продолжить обновление.Но тогда как мне убедиться, что последующая операция чтения не начнется, пока операция записи не завершится?
Вот пример со словарем, который я упомянул выше:
R1: через 0 секунд происходит чтение, для завершения которого требуется 5 секунд
R2: через 2 секунды приходит другое чтение, для которого требуется 5секунд до завершения
W1: через 4 секунды приходит операция записи, требующая доступа к словарю в течение 3 секунд
R3: через 6 секунд приходит другое чтение, для завершения которого требуется 5 секунд
W2: через 8 секунд другая записьдля завершения операции также требуется 3 секунды
В идеале вышеприведенное должно воспроизводиться так:
R1 начинается в 0 секунд, заканчивается в 5
R2 начинается в 2 секунды, заканчивается в 7
W1 начинается в 7 секунд, заканчивается в 10
R3 начинается в 10 секунд, заканчивается в 15
W2 начинается в 15 секунд, заканчивается в 18
Примечание: даже если R3 прибыл в 6 секунд,запуск W1 был невозможен, потому что W1 пришел раньше.
Как лучше всего реализовать вышеизложенное с помощью GCD?