Реализация циклического буфера на C

Я нашел псевдокод о том, как реализовать циклический буфер.

// 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, не так ли?


person bruce12    schedule 19.09.2011    source источник


Ответы (3)


С участием

w = b[out];

Вы берете только копию предмета для потребления. С участием

out = (out + 1) % n;

Вы увеличиваете индекс потребляемого элемента, тем самым предотвращая повторные ссылки на него.

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

person Edwin Buck    schedule 19.09.2011

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

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

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

person Heisenbug    schedule 19.09.2011
comment
когда он говорит /* produce item v */, нам нужно присвоить v случайное число или что-то в этом роде.. я думал, что нам нужен другой процесс для `/* потреблять элемент w. */` - person bruce12; 20.09.2011
comment
потреблять элемент означает извлекать его значение и больше не получать к нему доступ. - person Heisenbug; 20.09.2011
comment
Комментарий относится к предыдущим двум строкам. - что, я бы добавил, должно быть незаконным. - person Steve Jessop; 20.09.2011

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

person nulvinge    schedule 19.09.2011