Возможна проблема, когда get () из массива не является атомарным с приращением при удалении синхронизированного блока.Сценарий прерывания, о котором я размышляю, требует, чтобы производитель перегружал потребителей, тогда вы могли бы сделать так, чтобы производитель перезаписал запись массива, которая еще не была прочитана, ЕСЛИ выпуск семафора был вызван чтением не по порядку.
Рассмотрим ситуацию, когда буфер заполнен (индекс записывающего устройства равен N, индекс считывающего устройства равен N + 1), и два потока пытаются выполнить чтение из буфера.(Предположим, что N не близко к точке обтекания для простоты.)
Поток 1 получает индекс N + 1 для чтения своего элемента.
Поток 2 получает индекс N + 2из которого нужно прочитать свой элемент.
Из-за случайного планирования поток 2 сначала получает из буферного массива и освобождает семафор m_full
до того, как поток 1 получает свой элемент из массива.
Поток 3 (производитель) просыпается и записывает элемент в следующий доступный слот N + 1 в буфере, также до того, как поток 1 прочитает из буфера.
Затем поток 1 получает элемент по индексу N +1, но пропустил нужный товар.