Есть вопрос по поводу многопоточности. Занимаюсь самописным компилятором, который изначально был задуман для однопоточных программ, то есть он не генерирует код с read и write барьерами. Создаю несколько потоков в Windows при помощи CreateThread, которые должны разделять общую структуру данных: двусвязный список с указателями на начало и конец списка. Взаимоисключение реализовано на основе алгоритма Деккера, то есть busy wait. В некоторых случаях происходят ошибки при добавлении в этот двусвязный список. Там простые команды и их внимательно просмотрел. Логических ошибок там нет. Ошибки связываю с тем, что хотя один поток изменил список, для другого потока эти изменения оказались еще не видимы. Какие есть варианты, кроме добавления команд процессора: read и write барьеров. Возможно, есть какая-нибудь WinApi команда, которая заставит процессор скинуть все данные из кэша в основную память. Может быть есть какие-нибудь хитрости, например, изменить указатель, а затем считать этот указать, и при этом должно произойти обновление в памяти.