【问题标题】:Can only read one element at once of a circular buffer一次只能读取一个循环缓冲区的元素
【发布时间】:2015-06-08 09:12:36
【问题描述】:

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

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

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

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

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

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

所以,如果我正确理解了意思,这似乎表明这是用这种方式实现这种环形缓冲区的某种继承问题。

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

非常感谢您的帮助。

【问题讨论】:

    标签: queue buffer wikipedia


    【解决方案1】:

    嗯,我认为您正在小心地同步功能,以免遇到并发问题?不这样做可能会随机

    导致不良的缓冲行为

    【讨论】:

    • 是的,Jurru,我是。插入和删除由自旋锁保护。插入和删除是同一个锁,在每个操作开始时使用。是的,有办法让它更有效(例如,不同的读写锁),我只想让它先工作:-) 据我所知,没有锁定协议错误和输入/输出队列是正确的,它只是互锁的。事实上,我认为锁定导致了这种互锁,我似乎无法解释如何。谢谢,吉拉德
    • 如果您依赖自己的自旋锁实现,您的锁中可能存在竞争条件。如果您不使用原子设置和测试操作。但我不是 C 专家。
    猜你喜欢
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 2015-07-13
    • 2015-06-24
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多