Я реализовал стандартную очередь единственного потребителя, очередь одного производителя в виде циклического буфера в C, состоящего из массива и двух индексов: один для чтения, один для записи.
Мой круговой буфер относится к типу, который возвращает ошибку, если вы пытаетесь вставить элемент в полную очередь, и использует один пустой слот для разграничения пустого кольцевого буфера и полного.
Во время отладки я заметил, что когда-то он переходил в непротиворечивое состояние, в котором можно было прочитать только один элемент за раз, прежде чем получить возвращаемое значение, означающее, что буфер заполнен, даже если существовал текущий поток, который вставляет все время.
Я предположил, что, должно быть, сделал что-то глупое в реализации, но ничего не смог найти. Затем я решил перепроверить логику и перечитать значение Википедии , которое описывает такие очереди.
К моему большому удивлению, я заметил следующий загадочный комментарий в тексте:
Если вы не можете прочитать за границу буфера, вы можете столкнуться с множеством ситуаций, когда вы можете прочитать только один элемент за раз.
Так что, если я правильно понимаю значение, это, кажется, указывает на то, что это своего рода проблема наследования с таким способом реализации такого кольцевого буфера.
Увы, мой слабый мозг не в состоянии понять причину этой проблемы: почему это происходит? какая последовательность вставок и стираний может перевести такой кольцевой буфер в это состояние?
Ваша помощь очень ценится.