обычный круговой будер но данные с него можно читать пакетами, то есть записал в него данные размеров 10байт и прочитать можно будет тоже 10 байт
Разрешаю писать.
Я написал на основе lwrb сишную либу
Подсказать Сишный чат?
Стикер
Ну тип раз буфер пакет ( и круговой ). Если буфер уже заполнен, а нужно записать данные, буфер начинает перезаписывать старые данные и получается что пекет который еще не прочитан был перезаписан уже другим пакетом и если перезаписалась только часть этого пакета, получается при получении мы получим не полный пакет (поврежденный)
я акцент ставлю на " удаляется". как это происходит?
В общем нужно сделать такую очередь в которую данные записываются и читаются пакетами. Просто если буфер уже переполнен, то самый старый пакет должен стереться и вместо него записаться новый
Просто когда из буфера читается пакет - должен прочитаться валидный пакет, а как удаляется поломанный пакет не важно. Чем быстрее тем лучше)
В кольцевых буферах/очередях ничего удалять не нужно. Старые данные и так перепишутся новыми. Ты, видимо, хочешь какой-то механизм, чтобы consumer очереди не пытался взять уже переписанные данные? Если консумер один, то сама очередь может хранить указатель чтения. А так, вариантов можно кучу придумать. От динамического расширения очереди до observer'а, который сообщит консумерам, что N-ный элемент очереди протух и кто не успел прочитать - берите элемент N+1.
Допустим, первый байт пакета - его размер. У тебя есть указатель на следующий доступный к чтению пакет, есть указатель на следующий свободный байт буфера. Если при добавлении пакета указатель на запись + длина пакета больше указателя чтения - инкрементируешь указатель чтения на размер пакета под ним.
Ага, можно что-то вроде списка создать. И мне кажется это самый простой и правильный вариант
Но я сделал на основе другого кольцевого буфера 🤣
самый простой и в реализации и в использовании это кольцо на базе участка памяти. как говорится, просто и дёшево
Обсуждают сегодня