C中的循环缓冲区实现

时间:2011-09-19 22:00:30

标签: c data-structures circular-buffer

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

// 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,不是吗?

3 个答案:

答案 0 :(得分:9)

使用

w = b[out];

您只能获取要使用的项目的副本。与

out = (out + 1) % n;

提前消耗项目的索引,从而防止再次引用它。

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

答案 1 :(得分:1)

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

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

第一个提取值,第二个提取out索引。 评论指的是前两行。

答案 2 :(得分:0)

是的,因为它已经超出了缓冲区,后面的行显示为空。 然后我们可以处理w。