Циркулярный буфер реализации в C - PullRequest
8 голосов
/ 20 сентября 2011

Я нашел псевдокод для реализации циклического буфера.

// 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 ]

9 голосов
/ 20 сентября 2011

С

w = b[out];

Вы берете только копию предмета, который нужно использовать. С

out = (out + 1) % n;

Вы повышаете индекс предмета, который будет потребляться, тем самым предотвращая повторную ссылку на него.

В некотором смысле, несколько вызовов w = b[out]; на самом деле не занимают слот буфера, он просто обращается к нему; в то время как out = (out + 1) % n; предотвращает дальнейший доступ к этому предмету. Предотвращение дальнейшего доступа к элементу буфера - самое сильное определение термина «потреблять элемент», о котором я только могу подумать.

1 голос
/ 20 сентября 2011

обе эти строки являются частью процесса потребления:

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

Первая извлекает значение, а вторая увеличивает индекс выхода.Комментарий относится к предыдущим двум строкам.

0 голосов
/ 20 сентября 2011

Да, потому что тогда он вне буфера, который в следующей строке говорит, что пуст.Тогда мы можем обработать ш.

...