C中的循环缓冲区实现

bru*_*e12 8 c circular-buffer data-structures

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

// 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. */
}
Run Code Online (Sandbox Code Playgroud)

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

Edw*_*uck 9

w = b[out];
Run Code Online (Sandbox Code Playgroud)

您只需获取要使用的项目的副本.同

out = (out + 1) % n;
Run Code Online (Sandbox Code Playgroud)

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

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