ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
1005389 Топик полностью
fk0, легенда (17.05.2020 21:57, просмотров: 708) ответил LightElf на Ну, кагбэ, вопрос "че делать, если в буфере нет места" - нужно задавать до написания реализации ring buffer. Собственно вариантов четыре:
Пункт 1 не вариант, пункт 4 тоже -- это говнокод. Пункт 3 -- черти что, зачем оно может быть нужно? Реальны варианты 2 и 5. 5) вывод блокируется до появления свободного места в буфере -- требует примитивов синхронизации. Зачем в варианте 2 атомарный инкремент, и инкремент чего? Указатель записи двигает только писатель, а указатель чтения двигает только читатель. Противоположная сторона в обоих случаях (читатель и писатель соответственно) только читают не свой указатель 

для того чтоб понимать, сколько читать или сколько можно писать. И требование к атомарности только одно на самом деле: запись нового значения должна осуществляться целостно, за один раз. Пример не целостной записи: запись 16-битного значения по одному байтику на 8-битной платформе, где в середине может вклиниться прерывание. Здесь ни требуется ни атомарный инкремент, ни fetch-and-add, ни тем более compare-and-swap. Т.е. никакие спец. инструкции процессора не нужны вообще на том же арме. Требования такие же, как и к sig_atomic_t -- переменная должна писаться/читаться за одну инструкцию, не более того. Как я писал в другом сообщении, для варианта 2 нужно понимать сколько затёрто, т.е. насколько указатель записи обогнал указатель чтения. Раз он вообще смог обогнать, то он мог обогнать и более чем на один круг. Вот здесь идея вместо указателей использовать индексы и в старшие биты впихнуть счётчик кругов и пригодится. Допустим, для 64-кбайтного буфера на ARM можно отстать на 65536 кругов. А дальше -- мамой клянус.

[ZX]