Почему этот круговой дизайн буфера не требует какой-либо синхронизации?
В Википедии: в разделе CircularBuffer "Трудности-> Всегда держать один слот открытым" автор не упоминает никаких требований синхронизации между потоками:
Всегда держите один слот открытым
Этот дизайн всегда сохраняет один слот незанятым. Полный буфер имеет не более (размер-1) слотов. Если оба указателя ссылаются на один и тот же слот, буфер пуст. Если указатель окончания (записи) ссылается на слот, предшествующий тому, на который указывает указатель начала (чтения), буфер заполнен.
Преимущество:
- Решение простое и надежное.
Недостатки:
- Один слот теряется, поэтому это плохой компромисс, когда размер буфера мал>, или слот большой или реализован аппаратно.
- Полный тест требует операции по модулю
Почему нет такого требования? Порядок исполнения должен быть:
Вставьте новые данные
Увеличить индекс записи
Однако что, если компилятор изменяет порядок в порядке оптимизации?