LINUX.ORG.RU

История изменений

Исправление 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 все-таки