8

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

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

4

3 回答 3

9

w = b[out];

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

out = (out + 1) % n;

您推进要使用的项目的索引,从而防止再次引用它。

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

于 2011-09-19T22:11:04.617 回答
1

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

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

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

于 2011-09-19T22:06:51.480 回答
0

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

于 2011-09-19T22:04:39.147 回答