Может читать только один элемент сразу из кольцевого буфера - PullRequest
1 голос
/ 06 мая 2010

Я реализовал стандартную очередь единственного потребителя, очередь одного производителя в виде циклического буфера в C, состоящего из массива и двух индексов: один для чтения, один для записи.

Мой круговой буфер относится к типу, который возвращает ошибку, если вы пытаетесь вставить элемент в полную очередь, и использует один пустой слот для разграничения пустого кольцевого буфера и полного.

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

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

К моему большому удивлению, я заметил следующий загадочный комментарий в тексте:

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

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

Увы, мой слабый мозг не в состоянии понять причину этой проблемы: почему это происходит? какая последовательность вставок и стираний может перевести такой кольцевой буфер в это состояние?

Ваша помощь очень ценится.

1 Ответ

1 голос
/ 06 мая 2010

Хмм, я полагаю, вы стараетесь синхронизировать функции, чтобы у вас не возникало проблем с параллелизмом? Невыполнение этого требования может привести к плохому поведению буфера случайно

...