Цитата(AndrewN @ Dec 27 2013, 22:31)

Везение при том, что алгоритм вы описали неубедительный. Первый оверран испортит ваш кольцевой буфер, а вы и не заметите.
...
2), 3) - всё без исключения ложь. Когда вляпаетесь, не говорите, что мол, наколдовал.
Вообще говоря, мне не хочется подменять собой учебники. В учебниках говорится про синхронизацию и буферизацию и чем они отличаются.
Похоже Вы плохо представляете как правильно организовать FIFO, устойчивую к перекрывающимся вызовам из разных процессов (CPU) без критических секций.
И совершенно не поняли п.3 который написал
Hoodwin. Перечитайте его ещё и ещё. Там всё достаточно описано.
Поймите простой принцип использования FIFO: один процесс ТОЛЬКО ПИШЕТ, другой - ТОЛЬКО ЧИТАЕТ.
Указатель записи модифицирует ТОЛЬКО пишущий процесс, указатель чтения - ТОЛЬКО читающий. Никаких других переменных (изменяющихся в ходе работы FIFO)
быть не должно. Размер свободного места и размер занятого места в FIFO должны вычисляться только из текущих значений указателей и полного размера FIFO
(который - const). После модификации указателей, полезно вставлять инструкции барьеров (типа DMB в Cortex-ах).
Если следовать этому принципу, то FIFO можно использовать для передачи сообщений между процессами (CPU) без критических секций.
И никаких проблем с переполнением там нет. Пишущий процесс всегда может проверить сколько осталось места в очереди и отреагировать на это.
Как тогда скажите произойдёт ваше неожиданное переполнение??? Ведь другой процесс НЕ МОЖЕТ туда писать.
Насчёт атомарности операций записи: если в данном CPU имеются ассемблерные команды записи соответствующей разрядности (и нет проблем с выравниванием),
то запись указателя (позиции, индекса и т.п.) будет атомарной. Если у вас указатели FIFO 32-битные, то на ядрах C667х и ARM9 (в OMAP) запись будет одной командой.
Советую смотреть в листинг-файлы компилятора и изучать ассемблер.