Синхронизируйте циклический буфер с операцией записи и чтения без блокировки

У меня есть круговой буфер, в котором могут храниться кадры изображения, скажем, 30 кадров, и есть поток, который самостоятельно записывает в буфер. Существует основной поток, который считывает данные из буфера и копирует данные в другой буфер.

Проблема в том, что я не могу синхронизировать кольцевой буфер с операциями записи и чтения. Я не могу заблокировать кольцевой буфер, потому что операция записи выполняется потоком, к которому у меня нет доступа.

Есть ли способ проверить из основного потока, что кадр, который читает основной поток, не перезаписан?


person user1296153    schedule 18.08.2017    source источник
comment
Больше похоже на поиск магии: o для любого вида синхронизации должны участвовать обе стороны. Может быть (!) может быть есть какой-то другой способ решения проблемы, если бы вы показали код/объяснили ситуацию подробно.   -  person    schedule 19.08.2017
comment
Да... звучит так, как будто этот дизайн безвозвратно сломан. Кроме того, не следует массово копировать буферы, содержащие такие большие объемы данных, как файлы изображений, за исключением случаев, когда это абсолютно неизбежно. У вас есть malloc, указатели, а также вы можете создавать пулы буферов.   -  person Martin James    schedule 19.08.2017
comment
Есть ли способ проверить из основного потока, что кадр, который читает основной поток, не перезаписан? Прочтите это дважды. Если это то же самое, то оно не было перезаписано таким образом, что это имеет значение.   -  person chux - Reinstate Monica    schedule 19.08.2017
comment
@MartinJames Согласен, некоторые блокировки, флаги и т. д. предпочтительнее, но OP спросил, есть ли способ? Идея 2x подразумевает, что поток read может прочитать весь кадр хотя бы один раз, прежде чем поток write сможет изменить его дважды.   -  person chux - Reinstate Monica    schedule 19.08.2017
comment
@chux Прочитать дважды. На самом деле не работает — что, если поток чтения прочитает его дважды, в то время как поток записи заблокирован на полпути к записи копии? Обе копии одинаковые, и обе неполные/неправильные. Без доступа к коду автора этого нельзя исключать. И, конечно же, если оно верное, то вы должны прочитать его снова, чтобы убедиться, что оно не изменилось за время после двух прочтений...   -  person Andrew Henle    schedule 20.08.2017
comment
@AndrewHenle Хороший вопрос. С такой несинхронизированной системой я бы добавил порядковые номера, чтобы завершить данные, чтобы обнаружить проблему, которую вы предлагаете. Однако мы не знаем, какие изменения возможны, так как в посте нет подробностей.   -  person chux - Reinstate Monica    schedule 22.08.2017


Ответы (1)


Является ли ваш дизайн гибким? Если да, то используйте концепцию пейджинга, которая всегда полезна в задаче о циклическом буфере. Пожалуйста, укажите свой дизайн, чтобы кто-то мог вам помочь.

В противном случае вы можете записывать кадры в буфер с отметкой времени, поэтому используйте его, чтобы проверить, перезаписан ли кадр или нет.

Прости! «StackOverFlow», я нарушил ваше правило «Не просить разъяснений в ответах», я сделал это, потому что не могу комментировать этот вопрос, так как у меня нет «50 репутации».

person Anoop Mourya    schedule 03.09.2017