Почему C++ ring buffer читает данные раньше записи
23 сентября 2026
7
0

В однопроизводительном кольцевом буфере после миллионов операций потребитель иногда получал старые или частично обновлённые структуры. В отладочной сборке ошибка не проявлялась, а с -O2 срабатывала проверка целостности.
Причина: порядок памяти relaxed позволял потребителю увидеть новый индекс tail раньше данных в слоте. Запись tail с release публикует изменения, а чтение с acquire заставляет увидеть их до обращения к слоту.
Разбор ошибки и тестового стенда показывает, как поймать повреждение по контрольной сумме. Проверяйте такую очередь и с ThreadSanitizer, и в оптимизированной сборке.