【问题标题】:Circular buffer implementation in CC 中的循环缓冲区实现
【发布时间】:2011-09-19 22:00:30
【问题描述】:

我找到了关于如何实现循环缓冲区的伪代码。

// Producer.
while (true) {
  /* produce item v */
  while ((in+1)%n == out)
    /* Wait. */;
  b[in] = v;
  in = (in + 1) % n
}

// Consumer.
while (true) {
  while (in == out)
    /* Wait. */;
  w = b[out];
  out = (out + 1) % n;
  /* Consume item w. */
}

我不明白的是“消费项目 w”。评论,因为我认为w = b[out]; 我们正在消费w,不是吗?

【问题讨论】:

    标签: c data-structures circular-buffer


    【解决方案1】:

    w = b[out];
    

    您只获取要消耗的物品的副本。与

    out = (out + 1) % n;
    

    您提前了要使用的项目的索引,从而防止再次引用它。

    在某种程度上,对w = b[out]; 的多次调用实际上并没有消耗缓冲区的插槽,它只是访问它;而out = (out + 1) % n; 阻止进一步访问该项目。防止对缓冲区项目的进一步访问是我能想到的“消费项目”一词的最强定义。

    【讨论】:

      【解决方案2】:

      这两行都是消费过程的一部分:

      w = b[out];
      out = (out + 1) % n;
      

      第一个提取值,第二个增加 out 索引。 注释引用了前面两行。

      【讨论】:

      • 当它说 /* produce item v */ 我们需要将 v 分配给一个随机数或类似的东西.. 我认为我们需要一个不同的过程来处理 ` /* 消费项目 w。 */ `
      • 消费一个项目意味着检索它的价值并且不再访问它。
      • "注释是指前面两行。" - 我要补充的是,这应该是非法的。
      【解决方案3】:

      是的,因为它超出了缓冲区,下一行说它是空的。 然后我们就可以处理w了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多