Побочные эффекты на SMP системе

Однажды при реализации проекта я столкнулся с мнимой ошибкой на SMP системе. Для меня это послужило хорошим уроком. Три дня я потратил на поиск ошибки который на самом деле не было.

Я написал программу, которая обрабатывала данные и записывала их на носитель. Программа состояла из двух потоков. Основной поток принимал данные от клиента и после обработки записывал их в круговой буфер. Другой поток, работая с более низком приоритетом считывало эти данные из буфера и записывало их собственно на носитель. Таким образом, система могла быстро обрабатывать данные, а клиентам не было необходимости ждать когда система запишет его на носитель. Единственный вариант когда клиент должен был ожидать, когда буфер был полностью заполнен.

Я запустил тестирующую программу, и поначалу все было хорошо. Я не ждал никаких проблем, ведь это всего лишь математика, не более того. Последним тестом я решил полностью заполнить круговой буфер. Для контроля работы своей программы, я с помощью функции printfs() выводил на экран индексы буфера. Таким образом я мог проверить насколько эффектно работает моя система. И только при полной нагрузки я заметил что данные в буфере индексируются как то странно. Я не мог заполнить полностью этот буфер. Я несколько раз проверял код, но не мог найти ошибки. Я попытался отвлечься от этой задачи, сделал другую задачу, надеясь что мои мозги проветрятся и я увижу свою ошибку. Когда я вернулся, то ошибка стала очевидна. Я тестировал свою программу на SMP системе. И оба потока выполнялись одновременно. Соответственно как бы я не старался поток отвечающий за запись данных на носитель будет считывать их из буфера быстрее, чем поток отвечающий за их запись туда.