【发布时间】:2015-06-08 09:12:36
【问题描述】:
我已经将标准的单消费者、单生产者队列实现为 C 中的循环缓冲区,其中包含一个数组和两个索引:一个用于读取,一个用于写入。
如果您尝试将一项插入满队列并使用一个空槽来区分空环形缓冲区和满的环形缓冲区,我的循环缓冲区是一种返回错误的类型。
在调试它时,我注意到它有时会滑入一致状态,您一次只能读取一个项目,然后才能获得意味着缓冲区已满的返回值,即使有一个正在进行的线程确实插入了所有时间。
我认为我在实施过程中一定做了一些愚蠢的事情,但找不到任何东西。然后我决定仔细检查逻辑并重新阅读描述此类队列的Wikipedia value。
令我惊讶的是,我注意到文本中有以下神秘的评论:
如果您无法读取缓冲区边界,则会出现很多情况,您一次只能读取一个元素。
所以,如果我正确理解了意思,这似乎表明这是用这种方式实现这种环形缓冲区的某种继承问题。
唉,我虚弱的大脑无法理解这个问题的根本原因:为什么会发生这种情况?什么样的插入和擦除序列可以使这样的环形缓冲区进入这种状态?
非常感谢您的帮助。
【问题讨论】: