История изменений
Исправление
vertexua,
(текущая версия)
:
Вот lock-free алгоритм. Producer:
1. Начинаешь писать сообщение.
2. Сначала его контрольная сумма.
3. Потом длина
4. Потом тело
5. Потом парочку байт с 0. Их в контрольную сумму не включать.
6. Потом следующее сообщение
Consumer:
1. Читаешь контрольную сумму.
2. Читаешь длину. Если она какая-то странная, то все сообщений нет.
3. Если длина норм, читаешь все сообщение, подсчитывая контрольную сумму. Если совпало, то с помощью CAS пытаешься в последние пару байт записать свой номер consumer только если там 0. Если удалось - сообщение твое.
4. Читаешь следующие сообщение до первого поломанного сообщения или сообщения со странной длиной.
Минусы:
1. Контрольные суммы.
2. Работает только с polling
3. По-хорошему между записями в память без синхронизации нету отношения happens-before. Тут вроде должны спасать контрольные суммы, а так хз.
4. Нет гарантий справедливости распределения нагрузки. Но ты же сказал что считав сообщение его надолго уходят обрабатывать. Тогда вроде норм
Ну и не забудь добавить костылей для перезаписи и вращения по адресному пространству - circle buffer все-таки
Исходная версия
vertexua,
:
Вот lock-free алгоритм. Producer:
1. Начинаешь писать сообщение.
2. Сначала его контрольная сумма.
3. Потом длина
4. Потом тело
5. Потом парочку байт с 0. Их в контрольную сумму не включать.
6. Потом следующее сообщение
Consumer:
1. Читаешь контрольную сумму.
2. Читаешь длину. Если она какая-то странная, то все сообщений нет.
3. Если длина норм, читаешь все сообщение, подсчитывая контрольную сумму. Если совпало, то с помощью CAS пытаешься в последние пару байт записать свой номер consumer только если там 0. Если удалось - сообщение твое.
4. Читаешь следующие сообщение до первого поломанного сообщения или сообщения со странной длиной.
Минусы:
1. Контрольные суммы.
2. Работает только с polling
3. По-хорошему между записями в память без синхронизации нету отношения happens-before. Тут вроде должны спасать контрольные суммы, а так хз.
Ну и не забудь добавить костылей для перезаписи и вращения по адресному пространству - circle buffer все-таки