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