Я видел упоминание об использовании кольцевых буферов и контролируемого доступа к указателям местоположения, чтобы устранить или уменьшить необходимость в блокировках. Это не устраняет необходимость ожидания, и должно работать только тогда, когда кольцевой буфер имеет одного записывающего и одно считывающее устройство. В вашем случае вам понадобится как минимум два буфера.
Механизм, насколько я понимаю, таков:
- писатель ждет, пока не появится открытый слот (последний + 1! = текущий)
- писатель пишет запись в кольцевой буфер.
писатель обновляет указатель последней записи.
читатель ждет, пока в кольцевом буфере не появится доступная запись (последняя! = текущая).
- читатель обрабатывает запись.
- считыватель увеличивает текущий указатель.
В зависимости от используемого времени ожидания это может добавить задержку для новых элементов в пустой очереди или сжечь много циклов ЦП в цикле ожидания. Порядок обновления указателя и строгое разделение доступа на запись имеют решающее значение для этой работы. Записывающему устройству разрешено только записывать запись кольцевого буфера до увеличения указателя, чтобы сделать его доступным для читателя.