1

我已经将标准的单消费者、单生产者队列实现为 C 语言中的循环缓冲区,该缓冲区由一个数组和两个索引组成:一个用于读取,一个用于写入。

如果您尝试将项目插入完整队列并使用一个空槽来区分空环形缓冲区和完整的环形缓冲区,我的循环缓冲区是一种返回错误的类型。

在调试它时,我注意到它有时会进入一个一致的状态,在获得意味着缓冲区已满的返回值之前,您一次只能读取一个项目,即使有一个正在进行的线程一直在插入。

我以为我在实施过程中一定做了一些愚蠢的事情,但找不到任何东西。然后我决定仔细检查逻辑并重新阅读描述此类队列的维基百科值

令我惊讶的是,我注意到文本中有以下神秘的评论:

如果您无法读取缓冲区边界,则会出现很多情况,您一次只能读取一个元素。

因此,如果我正确理解了含义,这似乎表明这是某种继承问题,这种实现这种环形缓冲区的方式存在问题。

唉,我虚弱的大脑无法理解这个问题的根本原因:为什么会发生这种情况?什么样的插入和擦除序列可以使这样的环形缓冲区进入这种状态?

非常感谢您的帮助。

4

1 回答 1

1

嗯,我想你正在小心地同步函数,这样你就不会遇到并发问题?不这样做会随机导致不良的缓冲区行为

于 2010-05-06T15:23:18.653 回答