При отображении графиков по котировкам возникает задача одновременной записи (из одного потока) и чтения (из нескольких) циклического массива данных, представляющих собой key-value значения - по сути, "развернутая" хэш-таблица. Помимо редких операций вставки в начало и частых в конец, периодически возникает необходимость вставки в середину и итерации по массиву в обратном порядке, что приводит к необходимости держать массив отсортированным.
В общем случае подобная MWMR структура данных реализуется на основе сбалансированного дерева, очереди с приоритетами или скип-листа, что в данном случае излишне, поскольку писатель всегда один => проблем с расширением не возникает. Кроме того, хочется использовать массив из соображений эффективной работы с памятью.
Задача: разработать линеаризуемую версию алгоритма SWMR циклического отсортированного массива без блокировок.
Подходы
В основе лежит идея того, что если массив всегда сдвигать только в одну сторону, то итерация в эту сторону будет предоставлять гарантию, что все элементы, которые были в массиве на момент создания итератора, будут обойдены. Изначально она описана тут:
https://schani.wordpress.com/2007/08/18/a-reader-lock-free-sorted-array/
Поскольку элементы сложные (key - struct value), нужно обеспечить версионирование ячеек с ключами (или всего массива целиком) - нечетные версии сигнализируют о записи в процессе, четные - об окончании записи. Также видимо перед перемещением в ячейку нужно писать специальный маркерный ключ.
Алгоритм должен реализовывать следующий интерфейс: