Я предполагаю, что вы используете машину с более чем одним процессором или ядром. Если нет, то ваши занятые ожидания навредят. Они могут повредить в любом случае, если вы работаете в операционной системе, которая решает, что вы недостаточно спите, снижает динамический приоритет и работают другие программы.
Вам необходимо собрать данные о том, насколько заполнен ваш буфер. В какой-то момент слишком большой начинает повреждать ваш кеш тоже.
Если вы используете глобальный массив, а не выделяете его из кучи, тогда указатель на буфер становится литералом-указателем, и обоим потокам не нужно будет считывать это значение указателя из одного и того же места в кеше, поскольку он будет просто перемещен в код.
Если для вас важна пропускная способность (за счет задержки), а кеш действительно играет большую роль, то вы можете разрешить потребителю отставать от производителя, чтобы он не пытался читать и писать из одного и того же источника. поместить в буфер.
Возможно, вы захотите изменить интерфейс для вашей функции потребителя, чтобы он мог потреблять куски размера кеша (или кратно размеру) (это хорошо, если потребитель отстает от предложения производителя, которое я сделал выше) в дополнение к индивидуальному или частичному Кэш строки. Попробуйте сохранить выравнивание кеша потребления. Если вы думаете о доступных данных как о змее, то голова и хвост могут быть выровнены. Вы должны использовать не выровненный хвост, когда нет других данных для потребления. Если вы можете использовать любые другие данные в вызове для потребления, то вам просто нужно оставить хвост для следующего вызова.
Кроме этого и того, что было упомянуто caf, я должен был бы заподозрить, что все, что происходит вне этого кода, должно играть большую роль.