Кольцевой буфер. Указатель куда пишем. Отккда читаем. Атомарные флаги стою в мютексе например. Мютекс. Если чтение видит сравнивая указатели что данных нет то ставит флаг и блочится на мутексе. Запись когда видит флаг дергает мутеес. Чтение после этого флаг снимает. Например так. Очень криво и расчет на то что чтение постоянно данные насвпает
Арбитраж мьютексов и прочих примитивов, конечно, занимает время, но вообще, блокировки экономят время процессора, а не наоборот. Выгода будет выше, чем затраты на использование примитивов синхронизации.
Хотя, на многоядерной архитектуре, наверно можно заморочиться каким-то хитрым балансером, который будет отдавать излишки времени читающего потока на второстепенные задачи и тогдапотоки никогда тормозиться не будут...